你沒有在你的第二個鏈接不夠努力學習了答案 - 它有很完善的解決方案。
我更喜歡使用*]=
更換,而不是子該技術的變體:
@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),它可以在XP以後的任何Windows機器上本地運行,而不需要任何第三方exe文件。
例如,下面這個簡單的命令可以很快找到/替換文字。
call jrepl "<Tool>" "XYZ" /l /f "C:\abc.txt" /o -
您需要顯示您在問題中嘗試的代碼。 – Squashman
@Squashman感謝您的評論,我添加了我嘗試過的代碼。 – Albal