Come sostituire sottostringhe nel file batch di Windows

Qualcuno può dirmi usando il file batch in windows … come leggere da un file e sostituire string = bath dal file contenente = bath Abath Bbath XYZbathABC con stringhe hello modo che l’output sia come hello Ahello Bhello XYZhelloABC

Espandendoti da Andriy M , e sì puoi farlo da un file, anche uno con più linee

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

MODIFICARE

Grazie a David Nelson, ho aggiornato lo script in modo che non abbia più i valori codificati.

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

MODIFICARE

All’inizio non si vedeva che si desiderava che la sostituzione fosse preceduta leggendo la stringa da un file.

Bene, con un file batch non hai molte possibilità di lavorare sui file. In questo caso particolare, dovresti leggere una riga, eseguire la sostituzione, quindi emettere la linea modificata, e poi … Che poi? Se devi sostituire tutte le occorrenze di “bath” in tutto il file, dovrai utilizzare un ciclo:

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

È ansible aggiungere un reindirizzamento a un file:

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

Oppure puoi applicare il reindirizzamento al file batch. Deve essere un file diverso.

MODIFICA 2

Aggiunta corretta commutazione di espansione ritardata per la corretta elaborazione di alcuni caratteri che hanno un significato speciale con la syntax degli script in batch, come ! , ^ et al. (Grazie, jeb !)

Per evitare la disconnessione della linea vuota (dare leggibilità nel file conf), combino la risposta aflat e jeb ( qui ) a qualcosa di simile:

 @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% 

Per evitare problemi con il parser batch (ad es. Punto esclamativo), consultare Problema con la ricerca e sostituire il file batch .

Dopo la modifica dello script di aflat verranno inclusi caratteri speciali come i punti esclamativi.

 @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% 

È molto più semplice:

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

Per evitare di saltare righe vuote basta sostituire questo:

 echo !modified! >> %OUTTEXTFILE% 

con questo:

 echo.!modified! >> %OUTTEXTFILE% 

Se hai Ruby per Windows ,

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