【初心者向け】Linuxのsedコマンド徹底解説!文字列置換から実用例まで完全網羅

Linux

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:通常出力の抑制

実用的なテクニック

  • 正規表現との組み合わせ
  • 後方参照による高度な置換
  • 複数コマンドの組み合わせ

安全な使用方法

  • 事前のバックアップ作成
  • 段階的なテスト実行
  • 適切な区切り文字の選択

活用場面

  • ログファイルの整理・分析
  • 設定ファイルの一括更新
  • データ変換処理
  • システム管理の自動化

コメント

タイトルとURLをコピーしました