如何在Windowsbatch file中replace子string

任何人都可以告诉我在Windows中使用batch file…如何从文件中读取,并从文件包含= bath Abath Bbath XYZbathABCreplacestring= bath Abath Bbath XYZbathABCstringhello以便输出就像hello Ahello Bhello XYZhelloABC

从Andriy M扩展,是的,你可以从一个文件,即使是多行的文件

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

编辑

感谢David Nelson,我已经更新了脚本,所以它不再有硬编码的值。

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

编辑

最初没有看到你想要replace之前从文件中读取string。

那么,对于一个batch file,你没有太多的文件处理工具。 在这种特殊情况下,你必须读一行,执行replace,然后输出修改过的行,然后…然后呢? 如果你需要replace所有文件中的“洗澡”的所有发生,那么你将不得不使用循环:

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

您可以将redirect添加到文件中:

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

或者,您可以将redirect应用到batch file。 它必须是一个不同的文件。

编辑2

添加了正确的延迟扩展切换,以正确处理一些具有特殊含义的字符,如批处理脚本语法! 等人。 (谢谢, jeb !)

为了避免空行跳过(在conf文件中给出可读性),我将aflat和jeb的答案( 在这里 )结合起来,如下所示:

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

为了避免批parsing器(例如感叹号)出现问题 ,请查看“ search问题”并replacebatch file 。

aflat的脚本修改后将包含特殊字符,如感叹号。

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

为了避免空行跳过,只需将其replace为:

 echo !modified! >> %OUTTEXTFILE% 

有了这个:

 echo.!modified! >> %OUTTEXTFILE% 

这很容易:

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

如果你有Ruby for Windows ,

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