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 !)