Modificar archivo con .bat

Me gustaría saber si es posible a través de un .bat buscar una linea de texto especifica en un archivo y agregar un texto deseado o modificarla.

Quedo atento a sus comentarios y de antemano gracias por la ayuda.

1 Respuesta

Respuesta
2

A ver si te vale lo que se dice en este hilo:

http://www.todoexpertos.com/mitodoexpertos/question/2471642/batch-reemplazar-texto-dentro-de-archivos

Si no te sirve o no te sirve exactamente dímelo e intentaré ver si te puedo ayudar.

Saludos apreciado experto. la verdad no me deja acceder al hilo desde mi cuenta no se el porqué.

Te aclaro un poco lo que quiero por si alguna idea. La verdad es poco lo que he hecho en batch así que agradecería explicación detallada.

Tengo un archivo .txt con contenido y la linea 51 por ejemplo esta en blanco y deseo agregar un string en dicha linea pero a través de un batch ya que debo hacerlo en varios equipos.

Por otro lado tengo otro txt donde quiero buscar un string determinado y reemplazarlo por otro a través de un batch.

Gracias por cualquier aporte.

No entiendo que no puedas visitar ese enlace, pero bueno, no importa.

Para el segundo caso te puede ayudar lo que sigue:

======================================================

@echo off
copy nul + nul esc.txt >nul 2>nul
for /f %%i in (esc.txt) do echo.1r%1%%i%2%%ie|edlin %3 >nul
del esc.txt

======================================================

Salva el texto anterior, por ejemplo con ayuda del Bloc de notas, en un archivo al que le llamas REMPLAZA.BAT (o algo por el estilo). Luego lo llamas con

REMPLAZA cadorig cadsust archivo

Donde "cadorig" es la cadena ("string") que quieres que busque y sustituya, "cadsust" la cadena por la que quieres que se sustituya la anterior y "archivo" en nombre del archivo (con el path completo si interesa).

Lo anterior tiene dos limitaciones: no funciona con versiones del sistema operativo de 64 bits (algunas versiones de Vista o Windows 7) y las cadenas no pueden tener más de 253 caracteres de longitud. Si es tu caso dímelo que tengo otra versión menos elegante y con otras limitaciones distintas, pero que podría valer.

El primer caso (sustituir una línea en blanco) me parece más difícil, pero voy a estudiarlo. Ya te diré algo.

Ya he conseguido resolver el primer caso. He tenido que recurrir a un método un poco "rocambolesco" basándome en algo encontrado en (aprovecho para agradecerle a Leo Gutiérrez la información):

http://foro.elhacker.net/scripting/acciones_sobre_archivos_de_texto_batch-t242748.0.html

El BAT sería:

==================================

@echo off
Echo. > temp.txt
if "%2"=="" goto :ayuda
set cadsust=%1
set cadsust=%cadsust:"=%
del kkk.txt
for /f "skip=2 tokens=1*" %%x in ('fc /c /n temp.txt "%2" ^| findstr -v -mi "*****"') do (
call :revisar %%y
)
goto :fin
:revisar
if "%*"=="" (
echo %cadsust% >> kkk.txt
goto :eof
)
echo %* >> kkk.txt
goto :eof
:Ayuda
Echo Reemplaza las lineas en blanco en un archivo por la cadena indicada
echo Formato: %0 cadsust archivo
echo Si la cadena contiene espacios debe escribirse entrecomillada
echo El archivo corregido se deja en kkk.txt
echo Ejemplo:
Echo %0 "aqui habia una linea en blanco" kk.txt
:Fin

==================================

Respecto a la explicación detallada, será mejor que me digas que es lo que no entiendes del "programa" y yo te lo explico.

Ya me contarás.

Muchas gracias GGG, has sido demasiado amable, voy a probar ambas opciones, aunque te confieso que de la solución para el primer caso no entiendo claramente la linea

for /f "skip=2 tokens=1*" %%por in ('fc /c /n temp.txt "%2" ^| findstr -v -mi "*****"') do (
call :revisar %%y
)

Voy a probar las soluciones que me das y te comento.

Cordial saludo

Me imagino que
El "corrector/completador" de la página te ha jugado una mala pasada
porque si comparas las líneas de tu mensaje en las que dice:
for /f "skip=2 tokens=1*" %%por in ('fc /c /n
temp.txt "%2" ^| findstr -v -mi "*****"') do (
call :revisar %%y
)
Con lo que yo escribí, que era:
for /f "skip=2 tokens=1*" %%por in ('fc /c /n temp.txt "%2" ^| findstr -v -mi "*****"') do (
call :revisar %%y
)
Verás
Que se ha metido una extraña "morralla". A mí me ha pasado alguna vez
y, siempre que me acuerdo, desactivo esa opción (la última, la que tiene
"abc" en el icono).
Voy a intentar explicarte la línea.
En primer lugar el archivo temp.txt, creado al principio, contiene una
línea vacía. El comando "fc" (file compare) compara este archivo con el
que se le pasa en el segundo parámetro (%2) de la llamada al BAT. La
opción "/n" hace que numere las líneas diferentes y es la clave del
asunto (la otra opción "/c" acabo de comprobar que no es necesaria)
Porque es el número asignado a la línea en blanco el que hace que el
"for" la trate. El "findstr -v" (acabo de comprobar que tampoco hace
falta la opción "-mi") excluye de la salida de la comparación las líneas
con cinco asteriscos. Si te creas un archivo temp.txt con el comando
echo. > Temp.txt y ejecutas en una ventana de MSDOS la comparación
con algún archivo que tenga una línea en blanco (yo lo he hecho con uno
que se llama piripi.txt) te saldrá algo como:
d:\bat>fc /n temp.txt piripi.txt
Comparando archivos temp.txt y PIRIPI.TXT
***** temp.txt
1:
***** PIRIPI.TXT
1: Esto es cacho pamplina
2:
3: con lÝneas en blanco
4: ?
*****
De modo que al aplicarle el findstr -v "*****" saldrá:
d:\bat>fc /n temp.txt piripi.txt | findstr -v "*****"
Comparando archivos temp.txt y PIRIPI.TXT
1:
1: Esto es cacho pamplina
2:
3: Con lÝneas en blanco
4: .
El skip=2 sirve para saltarse las dos primeras líneas con lo que las líneas a tratar serían:
1: Esto es cacho pamplina
2:
3: Con lÝneas en blanco
4: .
El
Tokens=1* hace que, en cada una de las líneas anteriores, el primer
campo se guarde en la variable %%por y el segundo en la variable %%y (el
delimitador por defecto es el espacio), de modo que la variable %%por se
va quedando con los números y la %%y con el contenido de las líneas.
Espero que te ayude a entenderlo. Si quieres que te explique algo más dímelo, y dime también si te ha funcionado.

Al revisar si había novedades en este hilo he visto, en mi último mensaje, una errata, achacable al corrector/completador de la página. Donde dice:

El tokens=1* hace que, en cada una de las líneas anteriores, el primer
Campo se guarde en la variable %%por

Debería decir:

El tokens=1* hace que, en cada una de las líneas anteriores, el primer
Campo se guarde en la variable %%x

Espero que la corrección vaya bien.

Además la misma errata estaba en la aclaración inicial. Donde dice:

Con lo que yo escribí, que era:
for /f "skip=2 tokens=1*" %%por in ('fc /c /n temp.txt "%2" ^| findstr -v -mi "*****"') do (

Debería haber dicho

Con lo que yo escribí, que era:
for /f "skip=2 tokens=1*" %%x in ('fc /c /n temp.txt "%2" ^| findstr -v -mi "*****"') do (

Otra más:

Delimitador por defecto es el espacio), de modo que la variable %%por se

en vez de:

Delimitador por defecto es el espacio), de modo que la variable %%x se

Recuerdo que había revisado el texto antes de enviarlo pero creo que lo que me pasó es que se me había vencido el temporizador de espera y, aunque por una vez había tomado la precaución de copiar el texto antes de pulsar en "Enviar Respuesta", al volver a copiar no debí desactivar el maldito corrector.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas