sed コマンドは、テキストを読み込みながら編集(置換・削除・抽出など)を行うストリームエディタです。
ファイルを直接開かずに、「特定文字列を一括置換する」「条件に合う行だけ取り出す」「特定行を削除する」といった処理をコマンドラインから実行できます。
ログや設定ファイルの修正、バッチ処理の中でのテキスト整形などで頻繁に登場します。
s(substitute) や d(delete) などの編集コマンドと、正規表現を組み合わせて柔軟なテキスト処理が可能です。
sed [オプション] '編集コマンド' [ファイル...]sed [オプション] -f スクリプトファイル [ファイル...]
ファイルを指定しない場合は標準入力から読み込みます。
編集コマンドは、よく使うものとして次のようなものがあります。
s/パターン/置換文字列/フラグ: 文字列置換(substitute)/パターン/d: 行の削除(delete)/パターン/p: 行の表示(print)
オプション -n と p を組み合わせると「条件に一致した行だけ出力」、
-i を使うと「ファイルを書き換え(インプレース編集)」など、実務で便利なパターンがいくつかあります。
・行内の文字列を一括置換する(基本的な s コマンド)
sed 's/error/ERROR/' app.log
app.log の各行について、最初に出現する error を ERROR に置き換えて表示します。
このままだとファイル本体は書き換えず、標準出力に結果を流すだけです。
・行内のすべての一致箇所を置換する(g フラグ)
sed 's/error/ERROR/g' app.log
末尾の g フラグを付けることで、1 行の中に複数ある error をすべて置換します。
「1 行に 1 回だけ」ではなく「全部変えたい」場合は g を付けるのがポイントです。
・特定の文字を含む行だけを表示する(/パターン/p と -n)
sed -n '/ERROR/p' app.log
-n で自動出力を抑止し、/ERROR/p で ERROR を含む行だけを表示します。
grep ERROR app.log と似た動きですが、前後の行数指定や、複雑な編集と併用しやすいのが sed の強みです。
・特定の文字を含む行を削除して表示する(/パターン/d)
sed '/DEBUG/d' app.log
DEBUG を含む行を削除(出力しない)して、その他の行だけを表示します。
「デバッグログだけ省きたい」「特定のパターンを含む行を除外したい」ときに便利です。
・先頭から 1 行目を削除して 2 行目以降を表示する
sed '1d' data.txt
1d は、「1 行目を削除」という意味です。
CSV のヘッダ行だけを飛ばしたいときなどに、手軽に使えるパターンです。
・特定の行番号の範囲を削除する
sed '10,20d' data.txt
10 行目から 20 行目までを削除して、それ以外の行を表示します。
特定の行範囲をコメントアウトした扱いにしたいときなどに使えます。
・1 行目から 5 行目だけを表示する
sed -n '1,5p' data.txt
-n で自動出力を抑止し、1,5p で 1〜5 行目だけを表示します。
head -n 5 と似た動きですが、条件付きで範囲表示したい場合などに sed が柔軟です。
・インプレース編集でファイルを書き換える(-i)
sed -i 's/old_value/new_value/g' config.conf
-i は、編集結果を標準出力ではなく元ファイルに上書きする(インプレース編集)オプションです。
一気に書き換えられる反面、失敗すると元に戻せないので、バックアップ取得やテスト環境での確認を強くおすすめします。
環境によっては sed -i '' 's/.../.../' file のように「空文字の拡張子指定」が必要な場合もあります。
・インプレース編集時にバックアップファイルを残す
sed -i.bak 's/ssl off/ssl on/' nginx.conf
-i.bak のように拡張子を付けると、編集前のファイルを nginx.conf.bak として残しつつ、
nginx.conf を書き換えます。本番環境での編集では、できるだけバックアップ付きで実行する方が安全です。
・拡張正規表現を使って置換する(-r / -E)
sed -r 's/[0-9]+/NUM/g' input.txt
-r(または環境によっては -E)で拡張正規表現を有効にして、+ や ? などをそのまま使えるようにします。
この例では、「1 文字以上の数字」 [0-9]+ をまとめて NUM に置き換えています。
・複数の編集を一度に適用する(-e でスクリプトを複数指定)
sed -e 's/error/ERROR/g' -e '/DEBUG/d' app.log
-e で編集コマンドを複数指定し、順番に適用する例です。
ログ内で error を大文字にしつつ、DEBUG 行を削除する、といった複合処理が 1 回の sed で実行できます。
・編集コマンドを別ファイルにまとめて適用する(-f)
sed -f script.sed input.txt
複雑な sed スクリプトは script.sed のようなファイルに書いておき、-f で読み込んで実行することができます。
バッチ処理や定型作業では、この方法の方が保守しやすくなります。
・行の前後の空白を削除する(ちょっと応用)
sed -r 's/^[ \t]+//; s/[ \t]+$//' data.txt
^[ \t]+ で行頭のスペース・タブを削除し、[ \t]+$ で行末のスペース・タブを削除する例です。
2 つの s/// を ; で区切って 1 回の sed で実行しています。
・設定ファイルの一括置換・微修正
環境ごとに値が変わる設定ファイルを、sed で一括置換するのは定番です。
ただしインプレース編集(-i)は一歩間違えると壊れるので、必ずバックアップとテストを行う前提で使うのがおすすめです。
・ログの整形や抽出前処理
大量ログの前処理として、不要な行を削除したり、特定パターンだけを残したりするのに sed がよく使われます。
その後に awk や cut で整形し、sort や uniq で集計する、といったパイプライン処理の一部として使うイメージです。
・バッチ処理やデプロイスクリプト内のテキスト編集
「ファイルのこの行だけ差し替えたい」「このパラメータを有効化したい」といった修正を、
エディタで開かずに自動化する手段として sed は非常に強力です。
人手による編集ミスを減らしつつ、再現性の高い手順に落とし込めます。
・ちょっとした変換ツールとして
URL の一部書き換え、区切り文字の変換、余計な空白の削除など、専用ツールを用意するほどではない変換処理に、
1 行の sed コマンドで対応できる場面は多くあります。
sed は最初やや取っつきにくいですが、s///・/パターン/d・/パターン/p・-n・-i・-r/-E あたりを押さえておくだけでも、
「とりあえず sed」と言える場面が一気に増えます。
まずは標準出力で試しながら、慣れてきたらインプレース編集に進むのがおすすめです。
| short option | long option | description |
|---|---|---|
| -e | --expression | コマンドラインから実行する sed スクリプト(編集コマンド)を指定する(複数指定可) |
| -f | --file | 編集コマンドを記述したファイルを指定して読み込む |
| -n | --quiet | 自動出力を抑止し p コマンドなどで明示的に指定した行だけを出力する |
| -i | --in-place | 標準出力ではなく入力ファイル自体を書き換える(インプレース編集・拡張子指定でバックアップ作成可) |
| -r | --regexp-extended | 拡張正規表現を有効にする(環境によっては非推奨で -E を推奨) |
| -E | --regexp-extended | 拡張正規表現を有効にする(GNU sed などで -r と同等) |
| -s | --separate | 複数ファイルを個別のストリームとして扱いファイルごとに行番号などをリセットする |
| -u | --unbuffered | バッファリングを抑え行ごとに出力する(パイプでのリアルタイム処理向け) |
| -h | --help | sed コマンドの使い方(ヘルプ)を表示して終了する |
| -V | --version | sed コマンドのバージョン情報を表示して終了する |
ここでは GNU sed を前提として、実務でよく使われる主なオプションだけを TablePress の表としてまとめている想定です。
実際に利用できるオプションや挙動は、ディストリビューションやバージョンによって異なる場合があるため、
本番環境で使用する前に man sed で最新の仕様を確認してください。
新着情報
ブログランキングに参加しています。クリックして応援していただけると嬉しいです。
