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行ずつ)
- コマンド実行 → 編集処理
- 出力 → 結果表示
- 次の行 → 繰り返し
基本的な構文
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
以下の変更を一度に行ってください:
- server_name を "production.example.com" に変更
- debug_mode を false に変更
- log_level を "error" に変更
- 新しい設定 "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 を使ったデータ処理と分析について学びます。