siempre por lotes lista ejemplos ejecutar crear como comandos batch bat avanzados automaticamente archivos archivo administrador batch-file

batch file - lista - Cómo reemplazar subcadenas en el archivo por lotes de Windows



ejecutar bat como administrador siempre (7)

¿Alguien puede decirme usando el archivo por lotes en Windows ... cómo leer desde un archivo y reemplazar string = bath desde el archivo que contiene = bath Abath Bbath XYZbathABC con cadena hello para que la salida sea como hello Ahello Bhello XYZhelloABC


Ampliando desde Andriy M, y sí, puedes hacer esto desde un archivo, incluso uno con múltiples líneas

@echo off setlocal enabledelayedexpansion set INTEXTFILE=test.txt set OUTTEXTFILE=test_out.txt set SEARCHTEXT=bath set REPLACETEXT=hello set OUTPUTLINE= for /f "tokens=1,* delims=¶" %%A in ( ''"type %INTEXTFILE%"'') do ( SET string=%%A SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%! echo !modified! >> %OUTTEXTFILE% ) del %INTEXTFILE% rename %OUTTEXTFILE% %INTEXTFILE%

EDITAR

Gracias David Nelson, he actualizado el script para que ya no tenga los valores codificados.


Es mucho más fácil:

C:/Users/usera>set var="bath Abath Bbath XYZbathABC" C:/Users/usera>echo %var:bath=hello% "hello Ahello Bhello XYZhelloABC"


Para evitar el salto de línea en blanco (dar legibilidad en el archivo conf), combino aflat y jeb answer ( here ) para algo como esto:

@echo off setlocal enabledelayedexpansion set INTEXTFILE=test.txt set OUTTEXTFILE=test_out.txt set SEARCHTEXT=bath set REPLACETEXT=hello set OUTPUTLINE= for /f "tokens=1,* delims=¶" %%A in ( ''"findstr /n ^^ %INTEXTFILE%"'') do ( SET string=%%A for /f "delims=: tokens=1,*" %%a in ("!string!") do set "string=%%b" if "!string!" == "" ( echo.>>%OUTTEXTFILE% ) else ( SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%! echo !modified! >> %OUTTEXTFILE% ) ) del %INTEXTFILE% rename %OUTTEXTFILE% %INTEXTFILE%


Para evitar el salto de línea en blanco simplemente reemplace esto:

echo !modified! >> %OUTTEXTFILE%

con este:

echo.!modified! >> %OUTTEXTFILE%


Para evitar problemas con el analizador de lotes (por ejemplo, un signo de exclamación), observe el problema con la búsqueda y reemplace el archivo por lotes .

Después de la modificación del guión de se incluirán caracteres especiales como signos de exclamación.

@echo off setlocal DisableDelayedExpansion set INTEXTFILE=test.txt set OUTTEXTFILE=test_out.txt set SEARCHTEXT=bath set REPLACETEXT=hello set OUTPUTLINE= for /f "tokens=1,* delims=¶" %%A in ( ''"type %INTEXTFILE%"'') do ( SET string=%%A setlocal EnableDelayedExpansion SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%! >> %OUTTEXTFILE% echo(!modified! endlocal ) del %INTEXTFILE% rename %OUTTEXTFILE% %INTEXTFILE%


Si tienes Ruby para Windows ,

C:/>more file bath Abath Bbath XYZbathABC C:/>ruby -pne "$_.gsub!(/bath/,/"hello/")" file hello Ahello Bhello XYZhelloABC


SET string=bath Abath Bbath XYZbathABC SET modified=%string:bath=hello% ECHO %string% ECHO %modified%

EDITAR

Al principio no vio que quería que el reemplazo fuera precedido por la lectura de la cadena de un archivo.

Bueno, con un archivo por lotes no tienes mucha facilidad para trabajar en archivos. En este caso particular, tendrías que leer una línea, realizar el reemplazo, luego dar salida a la línea modificada, y luego ... ¿Entonces qué? Si necesita reemplazar todas las ocurrencias de ''baño'' en todo el archivo, entonces tendrá que usar un bucle:

@ECHO OFF SETLOCAL DISABLEDELAYEDEXPANSION FOR /F %%L IN (file.txt) DO ( SET "line=%%L" SETLOCAL ENABLEDELAYEDEXPANSION ECHO !line:bath=hello! ENDLOCAL ) ENDLOCAL

Puede agregar una redirección a un archivo:

ECHO !line:bath=hello!>>file2.txt

O puede aplicar la redirección al archivo por lotes. Debe ser un archivo diferente.

EDIT 2

Se agregó la activación adecuada de la expansión retrasada para el procesamiento correcto de algunos caracteres que tienen un significado especial con la sintaxis del script por lotes, como ! , ^ et al. (Gracias, jeb !)