读取多个文本文件并使用批处理文件替换每个文件中的某种类型的字符串

时间:2013-03-12 09:31:44

标签: string batch-file replace

我需要从目录中读取所有文本文件,然后在每个文件中用另一个(替换为)替换某种类型的字符串(带有'volumelabel'的行)。以下是代码段:

for /r %%g in (*.txt) do (
 set filename=%%~nxg
 for /F "tokens=3 delims=<>" %%i in ('findstr "volumelabel" !filename!') do (
  set tobereplaced=%%i
 )
 echo !filename! has !tobereplaced! to be replaced by %replacewith%
 for /F "tokens=*" %%a in (!filename!) do (
  set str=%%a
  set str=!str:!tobereplaced!=%replacewith%!
  echo !str!>>new!filename!
 )
)

现在我遇到的问题是它在新文件的每一行只打印tobereplaced(字面意思)

set str=!str:!tobereplaced!=%replacewith%!
echo !str!>>new!filename!
使用

并在

时打印tobereplaced=replacewith(值)
set str=%str:!tobereplaced!=%replacewith%%
echo !str!>>new!filename!

被使用。有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

最简单的解决方案(以我的拙见)是使用set str的子程序。超过一级延迟扩张往往会导致严重的脑部受伤。哦,您可以通过执行类似

的操作来修复set str
call call call set str=%%%%str:%%tobereplaced%%=%replacewith%%%%%

......或类似的。看看我对脑部疼痛的意义?跟随递归很难。

所以这是我对解决方案的建议。当我在这里时,我还解决了另外两个潜在的问题。由于您正在对* .txt进行递归搜索,因此我使for循环能够处理它们在子目录中找到的任何文本文件。我没有对此进行过测试,如果您遇到任何奇怪的错误,请告诉我。

@echo off
setlocal enabledelayedexpansion
set replacewith=whatever

for /r %%g in (*.txt) do (
    set newfile=%%~dpng.new%%~xg
    for /F "tokens=3 delims=<>" %%i in ('findstr "volumelabel" "%%g"') do (
        set "tobereplaced=%%i"
        echo %%~nxg has !tobereplaced! to be replaced by %replacewith%

        rem combining your for loops this way makes the second only fire if the first is true
        rem using "findstr /n" in your for loop preserves blank lines
        for /F "delims=" %%a in ('findstr /n "^" "%%g"') do (

            rem ...but you have to strip off the line numbers
            set "str=%%a" && set "str=!str:*:=!"

            rem "call :repl" to work around the delayed expansion conundrum
            call :repl "!str!" "!tobereplaced!" "%replacewith%" str
            echo !str!>>!newfile!
        )
    )
)
goto :EOF

:repl <line> <find> <replace> <var>
setlocal enabledelayedexpansion
set "line=%~1"
set "line=!line:%~2=%~3!"
set "%4=%line%"
goto :EOF

警告:如果你的文本文件包含惊叹号,等号或克拉,它们可能不会进入textfile.new.txt。


对于它的价值,如果我在你的位置,而不是使用批处理文件,我可能会使用sed(二进制文件应该是你所需要的)。你甚至不需要一个脚本。你可以像这样做一个班轮:

for /r %I in (*.txt) do sed -r "s/volumelabel/replacement/ig" "%I" > "%~dpnI.new%~xI"

顺便说一句,请参阅help for的最后几页,了解%~dpnI符号的解释。