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でファイル化

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ