我一直在尝试使用批处理脚本查找并替换文本文件中的字符串。我偶然发现this answer几乎解决了我的问题,但输出文件中没有保留空行。我尝试了this answer too,但行以行号[] ... [17]
开头任何有助于扩展this answer以保留输出文件中的空行的帮助将不胜感激。 感谢
awk -v OFS='\t' '{ if ($(NF-1) == "Benign") sub($(NF+1)=$(NF-1); print $0 }' input
答案 0 :(得分:8)
你没有在第二个链接上学习答案 - 它有一个非常好的解决方案。
我更喜欢使用*]=
替换而不是使用子串的技术的变体:
@echo off
setlocal enableextensions disabledelayedexpansion
set "search=<Tool>"
set "replace=XYZ"
set "textFile=C:\abc.txt"
for /f "delims=" %%i in ('type "%textFile%" ^| find /v /n "" ^& break ^> "%textFile%"') do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:*]=!"
if defined line set "line=!line:%search%=%replace%!"
>>"%textFile%" echo(!line!
endlocal
)
但是代码没有被优化 - 追加重定向减慢了速度因为必须打开输出文件并且文件指针定位到循环的每次迭代的文件结尾。在循环之外重定向到临时文件一次要快得多,然后使用MOVE将原始文件替换为临时文件。
我也更喜欢使用FINDSTR而不是FIND - 它更好地处理长行,并且不需要管道或重定向。
@echo off
setlocal enableextensions disabledelayedexpansion
set "search=<Tool>"
set "replace=XYZ"
set "textFile=C:\abc.txt"
>"%textFile%.new" (
for /f "delims=" %%i in ('findstr /n "^" "%textFile%"') do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:*:=!"
if defined line set "line=!line:%search%=%replace%!"
echo(!line!
endlocal
)
)
move /y "%textFile%.new" "%textFile%" >nul
说实话,我从不使用纯批处理来修改文本文件。有太多的边缘情况需要很多神秘的代码才能解决。上述代码仍有许多潜在问题。例如:
=
*
或!
!
"
以及&
,|
等有毒字符,则替换可能会失败。我改用JREPL.BAT regular expression find/replace utility。它更快,更强大,更强大。它是纯脚本(混合批处理/ JScript),可以在任何Windows机器上从XP开始本地运行,而不需要第三方exe文件。
例如,以下简单命令可以非常快速地查找/替换文字。
call jrepl "<Tool>" "XYZ" /l /f "C:\abc.txt" /o -