テキスト処理 初級

sed コマンド入門 — ストリームエディタで文字列を置換・削除・抽出する

Linuxのストリームエディタ sed を使って、ファイルや標準入力のテキストを行単位で置換・削除・抽出する基本操作を学ぶ

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: ERRORCRITICAL に全置換してください。

問題 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 で整形する、という流れが現場でよく使われます。 基本的な置換・削除・抽出を身につければ、ログ解析やファイル一括変換が格段に楽になります。