2016-08-02 5 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を使用して元のファイルを一時ファイルに置き換える方がはるかに高速です。

また、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 - 
    
  • +0

    答えと説明をありがとう。それは働いた:)私はまた、FINDSTRの代わりにFINDを試して、私はいくつかの奇妙な出力を得ていた..しかし、あなたのソリューションは期待どおりに働いた.. :) – Albal

    関連する問題