我需要从目录中读取所有文本文件,然后在每个文件中用另一个(替换为)替换某种类型的字符串(带有'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!
被使用。有人能帮助我吗?
答案 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
符号的解释。