2026年5月17日
2026年5月17日
sedで複数行を一括置換する方法
はじめに
sedはストリームエディタとしてLinuxの定番テキスト処理ツールですが、デフォルトでは1行単位で動作するため、複数行にわたるパターンを置換するには少し工夫が必要です。設定ファイルの一括修正や、複数行のコメントブロック差し替えなどで活躍します。
本記事では、sedで複数行のテキストを安全に置換するパターンと、よく使うイディオムを実例付きで紹介します。
症状・背景
- 設定ファイルの複数行ブロックをまとめて書き換えたい
- 改行を含むパターンを置換したいがデフォルトのsedでは動作しない
- 特定の行範囲だけを対象に置換を行いたい
- バックアップを取りつつ安全に一括置換したい
手順・設定方法
ステップ1: 単一行の基本置換から始める
# 単純な置換(先頭マッチのみ)
sed 's/foo/bar/' file.txt
# グローバル置換(行内すべて)
sed 's/foo/bar/g' file.txt
# 直接ファイルを書き換える(バックアップ付き)
sed -i.bak 's/foo/bar/g' file.txt
ステップ2: 行範囲を指定して置換
# 10〜20行目だけ置換
sed '10,20 s/old/new/g' config.conf
# 特定パターンから別パターンまでの範囲
sed '/BEGIN/,/END/ s/debug/info/g' app.log
# 行番号と正規表現の組み合わせ
sed '/^server/,+5 s/timeout 30/timeout 60/' nginx.conf
ステップ3: 複数行パターンを置換(N コマンド)
# 連続2行を1行として読み込んでから置換
sed 'N; s/foo\nbar/REPLACED/' file.txt
# ホールドスペースを使い全行を一括処理
sed ':a;N;$!ba; s/foo\nbar\nbaz/NEW/g' file.txt
# 改行込みの3行ブロックを削除
sed '/start/,/end/d' config.txt
ステップ4: 安全な一括処理とテスト
# まず差分を確認(dry-run的に標準出力へ)
sed 's/old_host/new_host/g' /etc/hosts | diff /etc/hosts -
# 複数ファイルを一括処理
find /etc/app -name '*.conf' -exec sed -i.bak 's/127.0.0.1/0.0.0.0/g' {} +
# スクリプトファイル経由で複数命令を適用
sed -f rules.sed input.txt > output.txt
注意事項
-iオプションは即座にファイルを書き換えるため、必ずバックアップを取りましょう- BSD sed(macOS)とGNU sedで
-iの引数指定が異なります - 改行を含む処理は
Nや:a;N;$!baイディオムが必須です - 区切り文字
/はパスを扱う際に|や#に変更すると見やすくなります
まとめ
1. 基本置換: s/旧/新/gで行内すべてを置換
2. 行範囲指定: 行番号やパターンで対象を限定可能
3. 複数行処理: Nコマンドで改行越しの置換が可能
4. バックアップ: -i.bakで安全に直接書き換え
5. スクリプト化: 複雑なルールは-fでファイル化
関連記事: