ディレクトリ内に複数のテキストファイルがあり、それぞれの文字列1 setlinewidthを10 setlinewidthに置き換える必要があります。 Windows cmdでこれを行うにはどうすればよいですか?助けてください。
サードパーティのユーティリティをインストールできる場合、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
)
Powershellには、外部のソフトウェアやユーティリティをダウンロードせずにこの問題を解決するユーティリティがあります。チェックアウト この記事 はScripting Guyによるもので、非常に優れています。また、 Set-Content のドキュメントもご覧ください。
例:
(Get-Content C:\Scripts\Test.txt) | Foreach-Object {$_ -replace "oldString", "newString"} | Set-Content C:\Scripts\Test.txt