メインコンテンツへスキップ
レッスン 2 / 8推定時間: 35

sed - ストリームエディタ

sed の高度な機能を使って、複雑なテキスト変換、置換、編集を自動化する方法を習得します

このレッスンの学習目標

  • sed の基本構文と動作原理を理解する
  • 複雑な置換パターンを作成できる
  • sed スクリプトを活用できる
  • 実践的なテキスト処理タスクを自動化できる

sed の基本概念

sed(Stream Editor)は、ストリーム指向のテキストエディタです。ファイルを行ごとに読み込み、パターンに基づいて編集を行います。

sed の動作原理

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

sed の処理フロー:

  1. 入力 → パターンスペース(1行ずつ)
  2. コマンド実行 → 編集処理
  3. 出力 → 結果表示
  4. 次の行 → 繰り返し

基本的な構文

sed [options] 'command' file
sed [options] -e 'command1' -e 'command2' file
sed [options] -f script_file file

基本的な編集コマンド

s コマンド(置換)

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# 基本的な置換
sed 's/hello/hi/' text.txt          # 各行の最初のhelloをhiに置換

# グローバル置換
sed 's/hello/hi/g' text.txt         # すべてのhelloを置換

# 大文字小文字無視(GNU sed)
sed 's/hello/hi/I' text.txt         # 大文字小文字を無視

# n番目の出現を置換
sed 's/hello/hi/2' text.txt         # 各行の2番目のhelloのみ

# 区切り文字の変更
sed 's|/old/path|/new/path|g' text.txt  # / の代わりに | を使用

# 置換内容に & を使用(マッチした文字列)
sed 's/hello/[&]/g' text.txt        # hello → [hello]

後方参照の活用

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# グループ化と後方参照
sed 's/\([A-Za-z]*\) \([A-Za-z]*\)/\2, \1/' names.txt  # "First Last" → "Last, First"

# 複数のグループ
echo "2024-01-15" | sed 's|\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)|\3/\2/\1|'

# より複雑な例:電話番号の整形
echo "1234567890" | sed 's/\([0-9]\{3\}\)\([0-9]\{3\}\)\([0-9]\{4\}\)/(\1) \2-\3/'

d コマンド(削除)

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# 特定の行を削除
sed '2d' delete_test.txt             # 2行目を削除
sed '2,4d' delete_test.txt           # 2-4行目を削除
sed '$d' delete_test.txt             # 最終行を削除

# パターンマッチで削除
sed '/delete/d' delete_test.txt      # "delete"を含む行を削除
sed '/^#/d' delete_test.txt          # コメント行を削除
sed '/^$/d' delete_test.txt          # 空行を削除

# 範囲削除
sed '/start/,/end/d' delete_test.txt # startからendまでの行を削除

p コマンド(印刷)

# 特定の行のみ印刷
sed -n '2p' delete_test.txt          # 2行目のみ印刷 (-n で自動印刷を抑制)
sed -n '1,3p' delete_test.txt        # 1-3行目を印刷

# パターンマッチで印刷
sed -n '/keep/p' delete_test.txt     # "keep"を含む行のみ印刷

# 置換と印刷の組み合わせ
sed -n 's/keep/KEEP/p' delete_test.txt  # 置換が成功した行のみ印刷

a, i, c コマンド(追加、挿入、置換)

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# 行の追加(a)
sed '2a\\inserted after line 2' modify.txt

# 行の挿入(i)
sed '2i\\inserted before line 2' modify.txt

# 行の置換(c)
sed '2c\\replaced line 2' modify.txt

# 複数行の追加
sed '2a\\line1 of addition\\nline2 of addition' modify.txt

# パターンマッチで操作
sed '/line2/a\\added after line2' modify.txt

アドレス指定

行番号による指定

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# 単一行
sed '3s/C/THREE/' lines.txt          # 3行目のみ置換

# 範囲指定
sed '2,5s/.*/[&]/' lines.txt         # 2-5行目を [] で囲む

# 最終行
sed '$s/.*/LAST/' lines.txt          # 最終行を置換

# ステップ指定(GNU sed)
sed '1~2s/.*/ODD/' lines.txt         # 1行目から2行おきに処理

パターンによる指定

# 正規表現マッチ
sed '/B/s/.*/MATCHED/' lines.txt     # "B"を含む行を置換

# 範囲指定(パターン)
sed '/B/,/E/s/.*/IN_RANGE/' lines.txt  # BからEまでの行

# 否定マッチ
sed '/B/!s/.*/NOT_B/' lines.txt      # "B"を含まない行

# 複雑なパターン
sed '/^[A-E]$/s/.*/UPPER_HALF/' lines.txt  # A-Eの行のみ

高度な機能

ホールドスペースの活用

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

ホールドスペースは sed の第二の作業領域です。

# h: パターンスペースをホールドスペースにコピー
# g: ホールドスペースをパターンスペースにコピー
# G: ホールドスペースをパターンスペースに追加
# x: パターンスペースとホールドスペースを交換

# 行の順序を逆にする
sed '1!G;h;$!d' hold_test.txt

# 前の行と現在の行を入れ替える
sed 'N;s/\(.*\)\n\(.*\)/\2\n\1/' hold_test.txt

# 重複行の削除
sed '$!N; /^\(.*\)\n\1$/!P; D' hold_test.txt

分岐コマンド

# b: 無条件分岐
# t: テスト分岐(直前の置換が成功した場合)

# 条件分岐の例
cat > branch_test.txt << 'EOF'
apple
banana
cherry
date
EOF

# 母音で始まる単語の処理
sed '/^[aeiou]/b vowel; s/^/consonant-/; b end; :vowel; s/^/vowel-/; :end' branch_test.txt

実践的なsedスクリプト

設定ファイルの編集

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# 設定値の変更
sed 's/^host=.*/host=production-server/' config.ini

# セクション内の特定値のみ変更
sed '/^\[database\]/,/^\[.*\]/{s/port=.*/port=5432/;}' config.ini

# コメントアウト
sed 's/^enabled=/#&/' config.ini

# 新しい設定の追加
sed '/^\[cache\]/a\max_size=1000' config.ini

ログファイルの処理

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# エラーログのみ抽出
sed -n '/ERROR/p' app.log

# タイムスタンプの整形
sed 's/^\([0-9-]*\) \([0-9:]*\)/[\1 \2]/' app.log

# ログレベルの色付け(ANSI エスケープシーケンス)
sed 's/ERROR/\\x1b[31m&\\x1b[0m/g; s/WARN/\\x1b[33m&\\x1b[0m/g' app.log

# 特定時間帯のログのみ抽出
sed -n '/10:30:1[67]/p' app.log

CSVデータの処理

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# 特定列の抽出(名前と都市)
sed 's/\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\)/\1,\3/' data.csv

# 条件付き編集(東京の給与を10%アップ)
sed '/,Tokyo,/{s/\([0-9]*\)$/\1*1.1/;}' data.csv

# ヘッダー行のスキップ
sed '1d' data.csv

# データの並び替え準備(ソートキーの追加)
sed '2,$s/^\([^,]*\),\([^,]*\),\([^,]*\),\([^,]*\)$/\2|\1,\2,\3,\4/' data.csv

sed スクリプトファイルの作成

複雑な処理のスクリプト化

# cleanup.sed ファイルの作成
cat > cleanup.sed << 'EOF'
# 空行の削除
/^$/d

# コメント行の削除(# で始まる行)
/^#/d

# 行末の空白削除
s/[[:space:]]*$//

# 連続する空白を1つに
s/[[:space:]]\+/ /g

# タブをスペース4つに変換
s/\t/    /g
EOF

# スクリプトの実行
sed -f cleanup.sed input_file.txt

条件分岐を使った高度な処理

# advanced.sed
cat > advanced.sed << 'EOF'
# HTMLタグの削除と整形
/<html>/b html_section
/<body>/b body_section
b end

:html_section
s/<[^>]*>//g
s/^[[:space:]]*//
s/[[:space:]]*$//
b end

:body_section
s/<p>/\n/g
s|</p>||g
s/<br>/\n/g

:end
EOF

実践演習

演習1: 設定ファイルの一括更新

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

以下の変更を一度に行ってください:

  1. server_name を "production.example.com" に変更
  2. debug_mode を false に変更
  3. log_level を "error" に変更
  4. 新しい設定 "ssl_enabled=true" を追加

解答例:

sed -e 's/^server_name=.*/server_name=production.example.com/' \
    -e 's/^debug_mode=.*/debug_mode=false/' \
    -e 's/^log_level=.*/log_level=error/' \
    -e '/max_connections/a ssl_enabled=true' \
    server.conf

演習2: ログの集計前処理

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

アクセスログから以下の形式でデータを抽出してください: IP|DATETIME|METHOD|URL|STATUS|SIZE

解答例:

sed 's|^\([0-9.]*\) - - \[\([^\]]*\)\] "\([A-Z]*\) \([^ ]*\) HTTP/[^"]*" \([0-9]*\) \([0-9]*\)$|\1\|\2\|\3\|\4\|\5\|\6|' access.log

演習3: HTMLテンプレートの生成

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

このデータから簡単なHTMLを生成してください。

解答例:

# sedを使ってHTMLテンプレートを生成
# 1. 最初にヘッダーを追加
echo '<!DOCTYPE html>
<html>
<head>' > output.html

# 2. テンプレートファイルを処理
sed 's|^TITLE: \(.*\)|<title>\1</title></head><body>|' template.txt | \
sed 's|^HEADER: \(.*\)|<h1>\1</h1>|' | \
sed 's|^CONTENT: \(.*\)|<p>\1</p>|' | \
sed 's|^FOOTER: \(.*\)|<footer>\1</footer>|' >> output.html

# 3. 最後にフッターを追加
echo '</body>
</html>' >> output.html

sed の最適化とベストプラクティス

パフォーマンスの考慮事項

# 効率的な書き方
sed 's/pattern/replacement/g' file.txt

# 非効率な例(複数のsedプロセス)
cat file.txt | sed 's/old1/new1/g' | sed 's/old2/new2/g'

# 効率的な例(1つのsedプロセス)
sed -e 's/old1/new1/g' -e 's/old2/new2/g' file.txt

# 大きなファイルでの早期終了
sed '1000q' large_file.txt  # 1000行目で停止

エラー回避のテクニック

# バックアップの作成(GNU sed)
sed -i.bak 's/old/new/g' file.txt

# 処理前のテスト
sed 's/old/new/g' file.txt > temp_file && mv temp_file file.txt

# パターンのエスケープ
PATTERN="path/with/slashes"
sed "s|$PATTERN|replacement|g" file.txt

まとめ

このレッスンでは、sed の基本から高度な機能まで学びました:

  • 基本的な編集コマンド(s, d, p, a, i, c)
  • アドレス指定と範囲処理
  • ホールドスペースと分岐コマンド
  • 実践的なテキスト処理例
  • sedスクリプトの作成と管理
  • パフォーマンスとベストプラクティス

sed は強力なテキスト処理ツールですが、複雑な処理では awk の方が適している場合もあります。

💡 次のレッスンでは、awk を使ったデータ処理と分析について学びます。

さらに学習を続けるには

素晴らしい学習ペースです!次のレッスンに進むには、無料会員登録をお願いします。無料会員では各コース3レッスンまで学習できます。

無料で続きを学ぶ

各コース3レッスンまで学習可能

学習進捗の自動保存

コース修了証明書の発行