Modificar una palabra por otra en .txt con batch
He intentado modificar una palabra por otra en un archivo .txt mediante batch pero solo me abre el archivo y no me cambia las palabras .
El archivo se llama purchs.txt y quiero cambiar la palabra de "trans" a "purchs"
Así lo estoy haciendo:
@echo off
Setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in ('purchs.txt') do (
set linea=%%x
set linea=!linea:trans=purchs!
call :show !linea!
)
Goto:eof
:Show
echo %* >> out.txt
Goto:eof
¿En qué estoy equivocándome?
Por lo que he podido ver tu único error es haber puesto entre comillas simples el nombre del archivo. El FOR debería ser así:
for /f "tokens=* delims=" %%x in (purchs.txt) do (
Por otra parte no sería necesario usar CALL aunque puede estar justificado si vas a hacer más cosas con las líneas cambiadas.
no me funciono, me indica que no se encuentra la ruta especificada, por lo que la comilla simple es necesaria....al tener comilla simple me abre el archivo por lo menos, pero aun no me cambia el texto...
La comilla simple no conseguirá lo que pretendes. Hay que averiguar por qué dice que no se encuentra la ruta especificada. Se me ocurre que puede ser porque esa ruta tiene espacios incluidos. Si es así lo que tendrás que hacer es ponerla entre comillas dobles, no simples. Antes de descartar tu opción deberías probar con un archivo que no tenga peculiaridades en el nombre. Te paso el ejemplo con el que he probado para que veas que funciona correctamente:
D:\BAT>type purchs.txt Primera linea ghkjhjhjk jjkk Segunda linea con trans y transportes y mas trans transtrans sin transtrans otra con trans y purchs D:\BAT>type mauri.bat @echo off Setlocal enabledelayedexpansion for /f "tokens=* delims=" %%x in (purchs.txt) do ( set linea=%%x set linea=!linea:trans=purchs! call :show !linea! ) goto:eof :show echo %* >> out.txt goto:eof D:\BAT>type out.txt El sistema no puede hallar el archivo especificado. D:\BAT>mauri D:\BAT>type out.txt Primera linea ghkjhjhjk jjkk Segunda linea con purchs y purchsportes y mas purchs purchspurchs sin purchspurchs otra con purchs y purchs
Puedes ver el contenido del purchs.txt y del mauri.bat (listados mediante TYPE). También que el out.txt no existía antes de ejecutar el bat y que luego tiene el contenido esperado.
me crea el archivo out pero no me modifica la palabra requerida dentro del archivo purchs.txt....
en el archivo out solo se repite la palabra purchs, pero no se realiza cambio de modificar el texto
Pero, ¿ya has conseguido que lea el PURCHS.TXT en su ubicación? ¿Era el problema del espacio?
Ahora ten en cuenta que debes borrar el OUT.TXT antes de ejecutar el bat porque con la sintaxis del ECHO te va a añadir a lo que ya hubiera y eso puede dar lugar a malas interpretaciones.
Si quieres poner unos comandos de depuración puedes incluir el comando
Echo ! Linea!
Antes y después del SET de sustitución, para ver si es que el SET no está haciendo lo que se espera de él.
El .bat esta armado de la siguiente manera:
@echo off Setlocal enabledelayedexpansion for /f "tokens=* delims=" %%x in ('purchs.txt') do ( set linea=%%x set linea=!linea:trans=purchs! call :show !linea! ) goto:eof :Show echo %* >> out.txt goto:eof
al hacerlo con comilla simple me arroja la siguiente pantalla del CMD (me abre el archivo .txt y queda el cmd en negro. Detallo el archivo .txt y .bat en rojo)
Al hacerlo sin comillas no pasa nada y al hacerlo con doble comilla me crea el out.txt, el cual muestra lo siguiente:
Lo que necesito es que en le archivo purchs.txt la palabra trans sea modificada y se cambie por purchs...
Tal ves la fórmula este bien y el problema sea la parametrización del archivo, ya que al abrirlo con texpad y tratar de copiar el texto me ocurre eso:
Estoy seguro que tu demás puedes dar con la solución de esto, yo no me la pude :(
Insisto en que con comillas simples no vas a conseguir nunca lo que pretendes.
Pero acabo de darme cuenta de que con comillas dobles no lo toma como archivo sino como una lista con un solo valor, precisamente "purchs.txt". Esa es la razón de que el contenido del out.txt sea el que dices.
Si ejecutas el bat en la misma carpeta en la que está el purchs.txt tiene que funcionar sin comillas, aunque el formato de ese archivo puede dar problemas porque parece contener caracteres que no son de texto. Prueba a hacer un TYPE PURCHS.TXT a ver que sale y pon el resultado en un snippet para que pueda copiarlo e intentarlo yo.
no se si estare utilizando bien el comando type :
@echo off
Setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in (TYPE purchs.txt) do (
set linea=%%x
set linea=!linea:trans=purchs!
call :show !linea!
)
goto:eof
:Show
echo %* >> out.txt
goto:eof
echo off Setlocal enabledelayedexpansion for /f "tokens=* delims=" %%x in (TYPE purchs.txt) do ( set linea=%%x set linea=!linea:trans=purchs! call :show !linea! ) goto:eof :Show echo %* >> out.txt goto:eof
Al ampliar tu último pantallazo ya he visto dónde está el problema. Antes no había conseguido leer el texto de la ventanita emergente que dice: "No se puede cortar, copiar o arrastrar y soltar texto que contenga caracteres nulos (código = 0)". El archivo contiene "caracteres nulos" y esos caracteres no puede manejarlos el comando FOR. Prueba a crearte un purchs.txt de prueba, que no contenga caracteres nulos (son caracteres cuyo código ASCII es el cero) y verás como funciona correctamente (sin comillas, ni simples ni dobles)-
No era así como quería que lo hicieras sino abriendo una ventana CMD, yendo a la carpeta donde tienes el archivo y tecleando:
type purchs.txt
Y copiando lo que saliera, pero ya no es necesario. Podrías probar con el TYPE dentro del comando FOR, como has hecho, pero entonces sí que tiene que estar dentro de comillas simples. Así:
for /f "tokens=* delims=" %%x in ('TYPE purchs.txt') do (
- Compartir respuesta