使用批处理脚本查找和替换文件中的匹配字符串

时间:2014-05-29 11:28:01

标签: batch-file cmd batch-processing

我编写了一个简单的脚本来查找和替换匹配的字符串。我在输出文件中遇到问题。以下是我的剧本

@echo off
setlocal ENABLEDELAYEDEXPANSION

for /f "tokens=1 delims=" %%a in ('FINDSTR "^applicationPort" "E:\BATCH-SCRIPTING\Version.txt"') do (
    echo Installed version is %%a
    set oldPort=%%a
)

for /f "tokens=1 delims=" %%b in ('FINDSTR "^applicationPort" "E:\BATCH-SCRIPTING\Sample.txt"') do (
    echo Installed version is %%b
    set newPort=%%b
)

set SEARCHTEXT="applicationPort=8080"
set REPLACETEXT="applicationPort=8090"

set file="E:\BATCH-SCRIPTING\Sample.txt"

for /f "tokens=1,* delims=]" %%A in ('"type %file% |find /n /v """') do (
set "line=%%B"
if defined line (
call echo %%line:%SEARCHTEXT%=%REPLACETEXT%%%>> %file%_new
) ELSE echo.
)

move /Y %file%_new %file% > nul

在我的输出文件中,预期输出应为:applicationPort=8090,但我得到8080=applicationPort=8090=8080

任何人都可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

看看第一轮变数扩张后你的关键替换线会是什么样的:

call echo %%line:%SEARCHTEXT%=%REPLACETEXT%%%>> %file%_new

变为

call echo %line:applicationPort=8080=applicationPort=8090%>>"E:\BATCH-SCRIPTING\Sample.txt"

搜索/替换解析器在它看到的第一个=处结束搜索短语。因此,在CALL之后,它会搜索applicationPort并将其替换为8080=applicationPort=8090。完全合乎逻辑。

坏消息是绝对没有办法逃脱搜索词中的=Replacing = is extremely difficult using a batch file。有解决方案,但我不推荐它们。相反,我会使用我的hybrid JScript/batch utility called REPL.BAT。它是从XP开始在任何Windows机器上运行的纯脚本。它执行正则表达式搜索并替换stdin并将结果写入stdout。完整的文档嵌入在脚本中。

@echo off
type "E:\BATCH-SCRIPTING\Sample.txt"|repl "applicationPort=8080" "applicationPort=8090" >"E:\BATCH-SCRIPTING\Sample.txt_new"
move /y "E:\BATCH-SCRIPTING\Sample.txt_new" "E:\BATCH-SCRIPTING\Sample.txt" 

REPL.BAT比使用纯批处理脚本更简单,更快速(也更强大)。