Linuxでのファイル操作やテキスト処理において欠かせないコマンドのひとつが「sed(セド)」です。
一見すると難しそうですが、実は覚えると非常に強力で便利なツールです。
「ファイルの一括置換ってどうやるの?」
「ログファイルから特定の行だけ削除したい」
「設定ファイルのパスを自動で変更したい」
そんな場面で威力を発揮するのがsedコマンドです。
この記事では、sedコマンドの基本的な使い方から、実務で役立つ応用例、さらにはありがちな失敗とその対処法まで、Linux初心者にもわかりやすく丁寧に解説します。
実際にコマンドを試しながら読み進めることで、sedマスターを目指しましょう!
sedとは?どんな場面で使うのか

sedの基本概念
sedとは: 「stream editor(ストリーム・エディタ)」の略語
簡単に言うと: ファイルや標準入力から読み取ったテキストを、自動で編集・加工するツール
sedの特徴
メリット:
- 高速処理:大きなファイルも瞬時に処理
- 自動化:スクリプトで繰り返し処理が可能
- 正規表現対応:複雑なパターンマッチングが可能
- 非破壊編集:元ファイルを保持しながら加工
他のツールとの比較:
ツール | 特徴 | 適用場面 |
---|---|---|
sed | ストリーム処理、高速 | 一括置換、行削除 |
awk | プログラミング的、列処理 | データ抽出、計算 |
grep | 検索特化 | パターン検索 |
vi/vim | 対話的編集 | 手動編集 |
実際の使用場面
システム管理:
- ログファイルの整理:エラー行の削除、日付形式の統一
- 設定ファイルの更新:パスの一括変更、パラメータ調整
- データベースダンプの加工:機密情報のマスキング
開発作業:
- ソースコードの一括修正:変数名の変更、コメント削除
- 設定ファイルのテンプレート化:環境別の設定生成
- ドキュメント生成:マークダウンからHTMLへの変換
データ処理:
- CSVファイルの整形:区切り文字の変更、不要列の削除
- レポート生成:数値形式の統一、ヘッダー追加
- バッチ処理:定期的なデータクリーニング
sedの基本文法

コマンドの基本構造
一般的な形式:
sed [オプション] 'コマンド' [ファイル名]
実例:
sed 's/old/new/' sample.txt
各部分の説明:
- sed:コマンド名
- s:置換コマンド
- old:検索する文字列
- new:置換する文字列
- sample.txt:対象ファイル
sedのコマンド種類
主要なコマンド:
コマンド | 機能 | 例 |
---|---|---|
s | 置換 | s/apple/orange/ |
d | 削除 | 3d (3行目削除) |
p | 表示 | 2p (2行目表示) |
a | 行追加 | a\新しい行 |
i | 行挿入 | i\挿入する行 |
c | 行置換 | c\置換する行 |
文字列の置換方法(sコマンド)
基本的な置換
基本文法:
sed 's/検索文字列/置換文字列/' ファイル名
実例と結果:
例1:単純な置換
# テストファイルの作成
echo "I like apple" > fruits.txt
# 置換実行
sed 's/apple/orange/' fruits.txt
結果:
I like orange
例2:数値の置換
echo "Price: 100 yen" | sed 's/100/200/'
結果:
Price: 200 yen
全体置換(gオプション)
問題:行内に同じ文字列が複数ある場合
例:
echo "apple apple apple" | sed 's/apple/orange/'
結果:
orange apple apple # 最初の1つだけ置換
解決方法:gオプション
echo "apple apple apple" | sed 's/apple/orange/g'
結果:
orange orange orange # すべて置換
大文字小文字を区別しない置換
Iオプション(GNU sed):
echo "Apple APPLE apple" | sed 's/apple/orange/gI'
結果:
orange orange orange
区切り文字の変更
デフォルトの区切り文字:/
問題:パス名に/
が含まれる場合
# これはエラーになる
sed 's//home/user//home/newuser/' file.txt
解決方法:別の区切り文字を使用
sed 's|/home/user|/home/newuser|g' file.txt
# または
sed 's#/home/user#/home/newuser#g' file.txt
置換のバリエーション
n番目のマッチを置換:
echo "cat cat cat" | sed 's/cat/dog/2' # 2番目のcatだけ
結果:
cat dog cat
特定の行のみ置換:
sed '2s/old/new/' file.txt # 2行目のみ
sed '2,4s/old/new/' file.txt # 2-4行目
行の削除と抽出

行番号による削除
単一行の削除:
# テストファイル作成
cat > lines.txt << EOF
Line 1
Line 2
Line 3
Line 4
Line 5
EOF
# 3行目を削除
sed '3d' lines.txt
結果:
Line 1
Line 2
Line 4
Line 5
範囲指定での削除:
sed '2,4d' lines.txt # 2-4行目を削除
結果:
Line 1
Line 5
最後の行を削除:
sed '$d' lines.txt # $は最終行を表す
パターンによる削除
特定の文字列を含む行を削除:
# ログファイルの例
cat > app.log << EOF
INFO: Application started
ERROR: Connection failed
DEBUG: Processing data
ERROR: Database timeout
INFO: Process completed
EOF
# ERROR行を削除
sed '/ERROR/d' app.log
結果:
INFO: Application started
DEBUG: Processing data
INFO: Process completed
正規表現による削除:
# 空行を削除
sed '/^$/d' file.txt
# コメント行(#で始まる行)を削除
sed '/^#/d' config.txt
# 数字のみの行を削除
sed '/^[0-9]*$/d' data.txt
行の抽出(表示)
特定の行のみ表示:
# -nオプション:通常の出力を抑制
sed -n '3p' lines.txt # 3行目のみ表示
範囲指定での表示:
sed -n '2,4p' lines.txt # 2-4行目を表示
パターンマッチング表示:
sed -n '/INFO/p' app.log # INFOを含む行のみ表示
正規表現との組み合わせ

基本的な正規表現
文字クラス:
# 数字にマッチ
sed 's/[0-9]/X/g' data.txt
# アルファベットにマッチ
sed 's/[a-zA-Z]/*/g' data.txt
# 空白文字にマッチ
sed 's/[[:space:]]/_/g' text.txt
量詞:
# 1回以上の繰り返し
sed 's/a\+/A/g' file.txt
# 0回以上の繰り返し
sed 's/a*/A/g' file.txt
# 指定回数の繰り返し
sed 's/[0-9]\{3\}/XXX/g' file.txt # 3桁の数字
実用的な正規表現例
電話番号のマスキング:
echo "TEL: 03-1234-5678" | sed 's/[0-9]\{2,4\}-[0-9]\{4\}-[0-9]\{4\}/XXX-XXXX-XXXX/'
結果:
TEL: XXX-XXXX-XXXX
メールアドレスのドメイン変更:
echo "user@oldsite.com" | sed 's/@.*\.com/@newsite.com/'
結果:
user@newsite.com
IPアドレスの抽出:
# アクセスログからIPアドレスのみ抽出
sed -n 's/^\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p' access.log
後方参照(バックリファレンス)
基本的な使い方:
# カッコで囲んだ部分を\1で参照
echo "John Smith" | sed 's/\([A-Za-z]*\) \([A-Za-z]*\)/\2, \1/'
結果:
Smith, John
複数の後方参照:
# 日付形式の変換 YYYY-MM-DD → DD/MM/YYYY
echo "2024-12-25" | sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\3\/\2\/\1/'
結果:
25/12/2024
インプレース編集(-iオプション)

基本的なインプレース編集
⚠️ 重要な注意: -i
オプションは元ファイルを直接変更します。
必ずバックアップを取ってから実行してください。
基本的な使い方:
# ファイルを直接編集
sed -i 's/old/new/g' sample.txt
実例:
# テストファイル作成
echo "old text old" > test.txt
cat test.txt # 確認
# インプレース編集
sed -i 's/old/new/g' test.txt
cat test.txt # 結果確認
結果:
new text new
バックアップ付きインプレース編集
推奨方法:バックアップを作成
sed -i.bak 's/old/new/g' sample.txt
結果:
sample.txt
:編集後のファイルsample.txt.bak
:元のファイルのバックアップ
macOS/BSD sed の注意点:
# macOSでは空文字列のオプションが必要
sed -i '' 's/old/new/g' sample.txt
# バックアップ付きの場合
sed -i '.bak' 's/old/new/g' sample.txt
複数ファイルの一括処理
単一コマンドで複数ファイル:
sed -i.bak 's/old/new/g' *.txt
スクリプトでの一括処理:
#!/bin/bash
for file in *.log; do
if [ -f "$file" ]; then
echo "Processing: $file"
sed -i.bak 's/ERROR/WARNING/g' "$file"
fi
done
高度なsedテクニック

複数のコマンドを組み合わせ
-eオプションで複数コマンド:
sed -e 's/apple/orange/g' -e 's/red/blue/g' fruits.txt
セミコロンで区切り:
sed 's/apple/orange/g; s/red/blue/g' fruits.txt
行の追加と挿入
行の追加(a):
# 2行目の後に新しい行を追加
sed '2a\This is a new line' file.txt
行の挿入(i):
# 2行目の前に新しい行を挿入
sed '2i\This is an inserted line' file.txt
行の置換(c):
# 2行目を完全に置換
sed '2c\This replaces the entire line' file.txt
条件付き処理
特定のパターンが見つかった次の行を処理:
# "START"の次の行を削除
sed '/START/{n;d;}' file.txt
アドレス範囲での処理:
# "BEGIN"から"END"までの行で置換
sed '/BEGIN/,/END/s/old/new/g' file.txt
実用的なsedスクリプト例

ログファイルの処理
アクセスログの整形:
#!/bin/bash
# アクセスログからエラーページのアクセスのみ抽出し、整形
sed -n '/40[0-9]\|50[0-9]/p' access.log | \
sed 's/\([0-9.]*\) .* \[\([^]]*\)\] .* \([0-9]*\) .*/IP: \1, Time: \2, Status: \3/'
設定ファイルの自動更新
Apache設定の更新:
#!/bin/bash
# Apache設定ファイルの自動更新
CONFIG_FILE="/etc/apache2/apache2.conf"
BACKUP_DIR="/backup/$(date +%Y%m%d)"
# バックアップディレクトリ作成
mkdir -p "$BACKUP_DIR"
# バックアップ作成
cp "$CONFIG_FILE" "$BACKUP_DIR/"
# 設定更新
sed -i.bak \
-e 's/ServerTokens OS/ServerTokens Prod/' \
-e 's/ServerSignature On/ServerSignature Off/' \
-e 's/#ServerName www.example.com:80/ServerName mysite.com:80/' \
"$CONFIG_FILE"
echo "Apache configuration updated successfully"
データ変換スクリプト
CSV形式の変換:
#!/bin/bash
# CSVデータの形式変換
# カンマ区切りをタブ区切りに変換
sed 's/,/\t/g' input.csv > output.tsv
# 特定列のデータ形式変更(日付形式)
sed 's/\([0-9]\{4\}\)\/\([0-9]\{2\}\)\/\([0-9]\{2\}\)/\1-\2-\3/g' dates.csv
# 金額のフォーマット統一
sed 's/\$\([0-9,]*\)/\1 USD/g' prices.csv
トラブルシューティングとよくある間違い

よくあるエラーと対処法
エラー1:区切り文字の問題
# ❌ 間違い:パスに/が含まれている
sed 's//home/user//home/newuser/' file.txt
# ✅ 正解:別の区切り文字を使用
sed 's|/home/user|/home/newuser|' file.txt
エラー2:正規表現の特殊文字
# ❌ 間違い:ドットがリテラル文字として扱われない
sed 's/192.168.1.1/10.0.0.1/' hosts.txt
# ✅ 正解:特殊文字をエスケープ
sed 's/192\.168\.1\.1/10.0.0.1/' hosts.txt
エラー3:バックアップなしでの編集
# ❌ 危険:バックアップなし
sed -i 's/important/deleted/' critical_file.txt
# ✅ 安全:バックアップ付き
sed -i.backup 's/important/new_value/' critical_file.txt
デバッグのコツ
段階的なテスト:
# 1. まずは画面出力で確認
sed 's/old/new/g' file.txt
# 2. 結果が正しければインプレース編集
sed -i.bak 's/old/new/g' file.txt
複雑なコマンドの分割:
# 複雑なコマンドは段階的に
cat file.txt | sed 's/old/new/g' | sed '/error/d' | sed 's/[0-9]/X/g'
パフォーマンスの最適化

大きなファイルの処理
効率的な処理方法:
# 行数制限での処理
sed -n '1,1000p' large_file.txt | sed 's/old/new/g'
# ストリーミング処理
tail -f /var/log/access.log | sed 's/ERROR/ALERT/g'
メモリ使用量の最適化
ストリーム処理の活用:
# パイプを使った効率的な処理
grep "pattern" large_file.txt | sed 's/old/new/g' > result.txt
まとめ
sedコマンドは、Linux環境でのファイル編集・文字列処理を自動化するための強力なツールです。
基本コマンド:
- s:文字列置換の基本
- d:行削除
- p:行表示(-nと組み合わせ)
重要なオプション:
- g:行内の全マッチを置換
- -i:インプレース編集(バックアップ推奨)
- -n:通常出力の抑制
実用的なテクニック:
- 正規表現との組み合わせ
- 後方参照による高度な置換
- 複数コマンドの組み合わせ
安全な使用方法:
- 事前のバックアップ作成
- 段階的なテスト実行
- 適切な区切り文字の選択
活用場面:
- ログファイルの整理・分析
- 設定ファイルの一括更新
- データ変換処理
- システム管理の自動化
コメント