web-dev-qa-db-ja.com

(ディレクトリ内の)複数のテキストファイル内の文字列を検索してWindows CMDで置き換える方法は?

ディレクトリ内に複数のテキストファイルがあり、それぞれの文字列1 setlinewidth10 setlinewidthに置き換える必要があります。 Windows cmdでこれを行うにはどうすればよいですか?助けてください。

7
Carla Hook

サードパーティのユーティリティをインストールできる場合、Gnu sed はこのタイプの操作用にカスタマイズされています。リンクは、ダウンロードしてインストールできるSourceforgeでホストされているWindowsバージョンを指します。これはプロンプトでの構文になります:

for %i in (*.txt) do sed -i "s/1 setlinewidth/10 setlinewidth/g" %i

注:-iオプションを指定すると、sedは問題のファイルを上書きするため、万が一に備えて簡単に使用可能なバックアップがあることを確認してください何かがおかしい。

Sedユーティリティをインストールできない場合、組み込みのバッチ言語だけを使用すると、これははるかに困難になります。

編集:外部ツールなしで置換を実行する小さなバッチファイルをまとめました。 foo.cmdまたは任意の名前を付けて保存し、コマンドラインから次のように呼び出します:foo.cmd

警告:これは質問の例から非常に具体的に書かれています。 1 setlinewidthの前後の行の先頭または末尾に他のテキストまたは余分なスペースがある場合、このバッチファイルは機能しません。これにより、元のテキストファイルのコピーが.bak拡張子(例:textfile.txt.bak)として保存されます。

@echo off
setlocal ENABLEEXTENSIONS
setlocal ENABLEDELAYEDEXPANSION

for %%a in (*.txt) do (
    echo Processing %%a...
    for /f "delims=^ tokens=1" %%i in (%%a) do (
        if /i "%%i"=="1 setlinewidth" (
            echo 10 setlinewidth>>%%a.new
        ) else (
            echo %%i>>%%a.new
        )
    )
    move /y %%a %%a.bak > nul
    ren %%a.new %%a
)
6
Scott McKinney

Powershellには、外部のソフトウェアやユーティリティをダウンロードせずにこの問題を解決するユーティリティがあります。チェックアウト この記事 はScripting Guyによるもので、非常に優れています。また、 Set-Content のドキュメントもご覧ください。

例:

(Get-Content C:\Scripts\Test.txt) | Foreach-Object {$_ -replace "oldString", "newString"} | Set-Content C:\Scripts\Test.txt

8
thisguy123