sed(Stream EDitor)は、ファイルや標準入力のテキストを 1行ずつ読み込んで加工 するコマンドです。
ファイルを開かずに文字列の置換・行の削除・特定行の抽出ができるため、ログ処理やシェルスクリプトで頻繁に使われます。
sed の基本構文
sed [オプション] 'スクリプト' [ファイル]
スクリプトには アドレス(対象行の指定)と コマンド(操作内容)を組み合わせて書きます。
1. 文字列の置換(s コマンド)
最もよく使う操作です。
# 書式: s/検索パターン/置換文字列/フラグ
echo "Hello World" | sed 's/World/Linux/'
# 出力: Hello Linux
各行で最初にマッチした箇所だけ置換(デフォルト)
echo "aaa bbb aaa" | sed 's/aaa/XXX/'
# 出力: XXX bbb aaa ← 最初の aaa だけ置換
行内のすべてのマッチを置換(g フラグ)
echo "aaa bbb aaa" | sed 's/aaa/XXX/g'
# 出力: XXX bbb XXX
大文字小文字を無視して置換(i フラグ)
echo "Hello hello HELLO" | sed 's/hello/Hi/gi'
# 出力: Hi Hi Hi
ファイルを直接書き換える(-i オプション)
# backup.txt をバックアップしながら上書き
sed -i.bak 's/foo/bar/g' sample.txt
# バックアップなしで直接書き換え(注意して使うこと)
sed -i 's/foo/bar/g' sample.txt
-i.bakのように拡張子を指定すると、元ファイルがsample.txt.bakとして残ります。
2. 行アドレスで対象行を絞る
スクリプトの先頭に 行番号 や 正規表現 を付けると、特定の行だけに操作を適用できます。
特定の行番号を指定する
# 2行目だけ置換
sed '2s/old/new/' sample.txt
# 3〜5行目を置換
sed '3,5s/old/new/' sample.txt
# 最終行($)を置換
sed '$s/old/new/' sample.txt
正規表現にマッチする行を指定する
# "error" を含む行だけ置換
sed '/error/s/error/ERROR/' sample.txt
# "start" から "end" の行まで置換
sed '/start/,/end/s/old/new/' sample.txt
3. 行の削除(d コマンド)
# 2行目を削除
sed '2d' sample.txt
# "debug" を含む行をすべて削除
sed '/debug/d' sample.txt
# 空行を削除
sed '/^$/d' sample.txt
# 先頭が # のコメント行を削除
sed '/^#/d' sample.txt
4. 行の出力(p コマンドと -n オプション)
デフォルトでは sed はすべての行を出力します。-n を付けると 明示的に p した行だけ 出力されます。
# "error" を含む行だけ表示(grep に似た使い方)
sed -n '/error/p' sample.txt
# 3〜5行目だけ表示
sed -n '3,5p' sample.txt
# 最初の10行を表示(head と同等)
sed -n '1,10p' sample.txt
5. 行の挿入・追記(i / a コマンド)
# 2行目の前に行を挿入(i = insert)
sed '2i\--- 区切り ---' sample.txt
# 2行目の後に行を追記(a = append)
sed '2a\--- 区切り ---' sample.txt
# "TODO" を含む行の前に警告を挿入
sed '/TODO/i\# 要対応:' sample.txt
6. 複数のスクリプトをまとめて実行
-e オプションで複数指定
sed -e 's/foo/bar/' -e 's/baz/qux/' sample.txt
セミコロンで区切る
sed 's/foo/bar/; s/baz/qux/' sample.txt
よく使うパターン集
| やりたいこと | コマンド例 |
|---|---|
| 文字列を全置換 | sed 's/old/new/g' file |
| 行末の空白を削除 | sed 's/[[:space:]]*$//' file |
| 先頭の空白を削除 | sed 's/^[[:space:]]*//' file |
| 空行を削除 | sed '/^$/d' file |
| コメント行を削除 | sed '/^#/d' file |
| 特定の行範囲を表示 | sed -n '5,10p' file |
| n 行目を削除 | sed 'nd' file |
練習問題
以下のファイル log.txt があるとします。
2026-07-12 INFO Server started
2026-07-12 DEBUG Connection opened
2026-07-12 ERROR Failed to read config
2026-07-12 INFO Request received
2026-07-12 DEBUG Processing request
2026-07-12 ERROR Timeout occurred
2026-07-12 INFO Server stopped
問題 1: DEBUG を含む行を削除して出力してください。
問題 2: ERROR を CRITICAL に全置換してください。
問題 3: 各行の先頭の日付部分(2026-07-12 )を削除してください。
問題 4: ERROR を含む行だけを表示してください。
答え
問題 1
sed '/DEBUG/d' log.txt
問題 2
sed 's/ERROR/CRITICAL/g' log.txt
問題 3
sed 's/^2026-07-12 //' log.txt
# または日付パターンを正規表現で汎用的に書く
sed 's/^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} //' log.txt
問題 4
sed -n '/ERROR/p' log.txt
sed はパイプと組み合わせることで真価を発揮します。
grep でフィルタリングしたあと sed で整形する、という流れが現場でよく使われます。
基本的な置換・削除・抽出を身につければ、ログ解析やファイル一括変換が格段に楽になります。