2016-08-02 42 views
2

我一直在嘗試使用批處理腳本查找並替換文本文件中的字符串。我遇到了幾乎解決了我的問題的this answer,但輸出文件中沒有保留空行。我已嘗試this answer too,但線條以行號開頭[] ... [17]保留文本文件中的空行同時使用批處理/ f

任何幫助來擴展this answer以保留輸出文件中的空行將不勝感激。 感謝

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:%search%=%replace%!" 
    >>"%textFile%" echo(!line! 
    endlocal 
) 

輸出看起來像: enter image description here

+1

您需要顯示您在問題中嘗試的代碼。 – Squashman

+0

@Squashman感謝您的評論,我添加了我嘗試過的代碼。 – Albal

回答

5

你沒有在你的第二個鏈接不夠努力學習了答案 - 它有很完善的解決方案。

我更喜歡使用*]=更換,而不是子該技術的變體:

@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 - 
+0

謝謝你的回答和解釋。它的工作:)我也嘗試FINDSTR而不是找到,我得到一些奇怪的輸出..但是,您的解決方案按預期工作.. :) – Albal