HOWTO · Batch

バッチ スクリプトでファイル内のテキストを置換する方法

バッチ スクリプト、PowerShell、またはインストール済みの sed 移植版を使って、Windows でファイル内のテキストを置換する方法を学びます。

このページの内容

Windows のコマンドラインからファイル内の一致するテキストを置換するには、変換した内容を別のファイルに書き込み、元のファイルの代わりに使用する前に確認します。バッチ スクリプトは単純なリテラル置換を実行でき、PowerShell はパターンに基づく置換を提供し、sed は Windows 移植版がインストールされている場合の選択肢です。例では小さなテキスト ファイルを使用し、sample を modified に置換します。

Windows バッチ スクリプトでテキストを置換する

このバッチの例は、独自の一時入力を作成し、空白でない各行を処理し、結果を別の出力ファイルに書き込みます。その後、出力を表示し、一時ファイルを削除します。既存の英語の echo コマンド リファレンスは、各行の書き込みに使用されるコマンドについて説明しています。findstr は変更の前後で一致する行を見つけるのに役立ちますが、検索するものであり、テキストを置換するものではありません。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "work=%TEMP%\batch-replace-%RANDOM%"
md "%work%"
set "inputFile=%work%\input.txt"
set "outputFile=%work%\output.txt"
> "%inputFile%" echo sample text, ready
>> "%inputFile%" echo keep this line
set "search=sample"
set "replace=modified"
(for /f "usebackq delims=" %%L in ("%inputFile%") do (
    set "line=%%L"
    set "line=!line:%search%=%replace%!"
    echo !line!
)) > "%outputFile%"
type "%outputFile%"
del "%inputFile%" "%outputFile%"
rmdir "%work%"
endlocal

for /f "usebackq delims=" %%L in ("%inputFile%") do ... は行を読み取り、遅延展開によりリテラル置換が適用され、ループをリダイレクトすることで結果が別のファイルに書き込まれます。この単純なパターンでは空白行がスキップされ、遅延展開により ! を含む行が変わることがあります。バッチ展開には特殊文字のルールがあるため、検索値と置換値は単純にしてください。行を正確に保持することや、より複雑なテキストが重要な場合は PowerShell を使用してください。

PowerShell でテキストを置換する

PowerShell は多くの Windows システムで利用でき、ファイルに空白行やバッチ展開を複雑にする文字が含まれる可能性がある場合に適しています。この自己完結型の例では、サンプル入力を作成し、sample を modified に置換し、バイト順マークなしの UTF-8 を書き込み、結果を表示し、一時ディレクトリを削除します。

$work = Join-Path ([IO.Path]::GetTempPath()) ([guid]::NewGuid().ToString())
New-Item -ItemType Directory -Path $work | Out-Null
$inputFile = Join-Path $work 'input.txt'
$outputFile = Join-Path $work 'output.txt'
[IO.File]::WriteAllText($inputFile, "sample text, ready`nkeep this line`n")
$text = [IO.File]::ReadAllText($inputFile)
$result = $text -replace 'sample', 'modified'
$utf8 = New-Object System.Text.UTF8Encoding -ArgumentList $false
[IO.File]::WriteAllText($outputFile, $result, $utf8)
Get-Content -LiteralPath $outputFile
Remove-Item -LiteralPath $work -Recurse -Force
modified text, ready
keep this line

-replace 演算子は最初の引数を正規表現として扱い、一致は既定で大文字と小文字を区別しません。正規表現のメタ文字を含むリテラルの検索文字列については、[regex]::Escape($search) でエスケープしてください。大文字と小文字を区別する必要がある場合は -creplace を使用してください。明示的な UTF-8 ライターにより、バージョン固有の既定値に頼ることを避けられます。元のファイルを置き換える前に、出力ファイルを確認してください。

Windows 上の sed でテキストを置換する

sed はすべての Windows インストールに含まれているわけではありません。Windows 移植版がインストールされ、PATH で利用できる場合にのみ使用してください。その置換形式は s/search/replacement/g です。この例では、sed "s/sample/modified/g" "input.txt" > "output.txt" を実行します。g フラグは各行のすべての一致を置換し、リダイレクトにより元のファイルと結果が分離されます。

検索値と置換値は sed によって解釈されるため、/、&、バックスラッシュなどの文字はエスケープが必要な場合があります。値にシェルの特殊文字が含まれる場合は、選択した移植版の引用規則を確認し、出力結果を元のファイルとして使用する前に確認してください。

方法を選択し、入力ファイルを保護する

空白行や感嘆符が重要でない、短く単純な置換では、バッチ ループにより追加のスクリプト依存を避けられます。リテラル テキスト、正規表現の動作、またはエンコーディングを制御する必要がある場合、PowerShell は実用的な既定の選択です。Windows 移植版がすでに利用でき、その置換構文がデータに合っている場合は sed を選択してください。

各方法では、変換の実行中に入力がそのまま保持されるよう、別の出力パスに書き込む必要があります。出力と元のファイルを比較し、想定されるエンコーディングを確認してから元のファイルを置き換えてください。ファイルに重要なデータが含まれている場合は、まずバックアップを作成してください。読み取り中の同じパスに出力をリダイレクトすると、処理が完了する前に、入力が切り捨てられることがあります。