あなたは十分に懸命にあなたの第二のリンクで答えを勉強しなかった - それは完璧に機能するソリューションを持っています。
は私ではなく、サブストリングの*]=
交換使用してその技術の変形好む:
@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を使用して元のファイルを一時ファイルに置き換える方がはるかに高速です。
また、FINDの代わりにFINDSTRを使用することをお勧めします。長い行を処理しやすく、パイプやリダイレクトは必要ありません。
@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を使用します。より速く、より堅牢で、はるかに強力です。これは、サードパーティのexeファイルを必要とせずに、XP以降の任意のWindowsマシンでネイティブに実行される純粋なスクリプト(ハイブリッドバッチ/ JScript)です。
たとえば、次の単純なコマンドは、リテラルの検索/置換を非常に迅速に行います。
call jrepl "<Tool>" "XYZ" /l /f "C:\abc.txt" /o -
あなたの質問に試したコードを表示する必要があります。 – Squashman
@Squashmanコメントをいただき、ありがとうございました。私が試したコードを追加しました。 – Albal