如何在Windows批处理文件中替换子字符串

时间:2011-03-11 14:10:09

标签: batch-file

任何人都可以告诉我在Windows中使用批处理文件...如何从文件中读取并从包含= bath的文件中用字符串bath Abath Bbath XYZbathABC替换string = hello以便输出就像hello Ahello Bhello XYZhelloABC

7 个答案:

答案 0 :(得分:87)

Andriy M扩展,是的,您可以从文件中执行此操作,即使是多行文件

@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

修改

感谢David Nelson,我已经更新了脚本,因此它不再具有硬编码值了。

答案 1 :(得分:39)

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

修改

一开始没有看到你想要在替换之前从文件中读取字符串。

好吧,使用批处理文件,您没有太多处理文件的工具。在这种特殊情况下,您必须读取一行,执行替换,然后输出修改后的行,然后......那么呢?如果你需要在所有文件中替换'bath'的所有发生,那么你将不得不使用循环:

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

您可以向文件添加重定向:

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

或者您可以将重定向应用于批处理文件。 必须是一个不同的文件。

编辑2

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

答案 2 :(得分:11)

为了避免空行跳过(在conf文件中提供可读性)我将aflat和jeb回答(here)结合到这样的事情:

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

答案 3 :(得分:3)

为避免批量解析器出现问题(例如感叹号),请查看Problem with search and replace batch 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%

答案 4 :(得分:0)

为避免空行跳过,请将其替换为:

echo !modified! >> %OUTTEXTFILE%

用这个:

echo.!modified! >> %OUTTEXTFILE%

答案 5 :(得分:0)

我已经为此创建了一个函数,您只需在需要编写更多代码的批处理程序中调用它即可。

工作基本上与其他工作相同,因为这是最好的工作方式。
Here's the link where I have that function

答案 6 :(得分:-7)

如果您有Ruby for Windows

C:\>more file
bath Abath Bbath XYZbathABC

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