はじめに

テキストファイルの中身を一括で置換したい、特定の行だけ削除したい、そんなときありますよね。sedコマンドはストリームエディタと呼ばれるツールで、テキストの検索・置換・削除・挿入などを自在に操れる超便利なコマンドです。

sedとは

sedは「Stream EDitor」の略で、テキストストリームを編集するためのコマンドラインツールです。ファイルを直接編集するエディタと違って、入力されたテキストを読み込んで、指定した処理を施して出力するのが特徴。パイプと組み合わせて使うことも多く、シェルスクリプトでのテキスト処理には欠かせない存在です。

設定ファイルの一括編集やログファイルの加工、データの整形など、テキスト処理のあらゆる場面で活躍します。

基本構文

1
2
3
sed [オプション] 'スクリプト' [ファイル...]
sed [オプション] -e 'スクリプト1' -e 'スクリプト2' [ファイル...]
sed [オプション] -f スクリプトファイル [ファイル...]

主なオプション

オプション 説明
-i ファイルを直接編集する(インプレース編集)
-i.bak バックアップを作成してから編集
-e 複数のスクリプトを指定
-n 自動出力を抑制(pコマンドと組み合わせて使用)
-r / -E 拡張正規表現を使用(システムにより異なる)
-f スクリプトファイルを読み込む

使用例

例1: 基本的な置換

1
2
3
# "old" を "new" に置換(各行の最初の一つだけ)
echo "old old text" | sed 's/old/new/'
# 出力: new old text

最もよく使う基本の置換です。デフォルトでは各行の最初にマッチしたものだけが置換されます。

例2: グローバル置換

1
2
3
# 行内のすべての "old" を "new" に置換
echo "old old text" | sed 's/old/new/g'
# 出力: new new text

gフラグをつけると、行内のすべてのマッチが置換されます。これめっちゃ使います。

例3: ファイル内の置換

1
2
3
4
5
# ファイル内の文字列を置換して結果を表示
sed 's/apple/orange/g' fruits.txt

# 結果を別ファイルに保存
sed 's/apple/orange/g' fruits.txt > fruits_new.txt

ファイルに対して置換を実行。元のファイルは変更されず、結果が標準出力に表示されます。

例4: インプレース編集(直接ファイルを書き換え)

1
2
3
4
5
# ファイルを直接編集
sed -i 's/old/new/g' config.txt

# バックアップを作成してから編集(推奨)
sed -i.bak 's/old/new/g' config.txt

-iオプションで元ファイルを直接書き換えられます。.bakをつけると元のファイルがバックアップとして保存されるので安全です。

例5: 特定の行だけ置換

1
2
3
4
5
6
7
8
# 3行目だけ置換
sed '3s/old/new/' file.txt

# 2行目から5行目まで置換
sed '2,5s/old/new/g' file.txt

# 最後の行だけ置換
sed '$s/old/new/' file.txt

行番号を指定すると、その行だけに処理を適用できます。

例6: 行の削除

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 3行目を削除
sed '3d' file.txt

# 2行目から5行目まで削除
sed '2,5d' file.txt

# 空行を削除
sed '/^$/d' file.txt

# 特定の文字列を含む行を削除
sed '/ERROR/d' log.txt

dコマンドで行を削除。パターンマッチも使えるので、条件に合う行だけ削除できます。

例7: 行の挿入・追加

1
2
3
4
5
6
7
8
# 3行目の前に新しい行を挿入
sed '3i\新しい行' file.txt

# 3行目の後に新しい行を追加
sed '3a\新しい行' file.txt

# 特定パターンの前に挿入
sed '/pattern/i\新しい行' file.txt

iで前に挿入、aで後に追加。ファイルに行を差し込みたいときに便利です。

例8: 特定の行だけ表示

1
2
3
4
5
6
7
8
# 3行目だけ表示
sed -n '3p' file.txt

# 2行目から5行目まで表示
sed -n '2,5p' file.txt

# パターンにマッチする行だけ表示(grepと似た動作)
sed -n '/ERROR/p' log.txt

-nオプションとpコマンドの組み合わせで、特定の行だけを抽出できます。

例9: 複数の置換を同時実行

1
2
3
4
5
# -eオプションで複数のスクリプトを指定
sed -e 's/apple/orange/g' -e 's/banana/grape/g' fruits.txt

# セミコロンで区切る方法
sed 's/apple/orange/g; s/banana/grape/g' fruits.txt

複数の置換処理を一度に実行できます。処理の順番も重要です。

例10: 拡張正規表現を使う

1
2
3
4
5
6
7
# 拡張正規表現で + や ? を使う(-Eまたは-r)
echo "test123" | sed -E 's/[0-9]+/NUM/g'
# 出力: testNUM

# グループ化と後方参照
echo "2025-10-26" | sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'
# 出力: 26/10/2025

-E(または-r)で拡張正規表現が使えます。より複雑なパターンマッチが可能に。

例11: 大文字・小文字の変換

1
2
3
4
5
6
7
# 小文字を大文字に変換
echo "hello world" | sed 's/.*/\U&/'
# 出力: HELLO WORLD

# 大文字を小文字に変換
echo "HELLO WORLD" | sed 's/.*/\L&/'
# 出力: hello world

\Uで大文字化、\Lで小文字化。&はマッチした文字列全体を表します。

例12: 範囲指定の高度な使い方

1
2
3
4
5
6
7
8
# 特定パターンから別のパターンまでの範囲を削除
sed '/START/,/END/d' file.txt

# 10行目から最後まで削除
sed '10,$d' file.txt

# 特定パターンから5行後まで表示
sed -n '/ERROR/,+5p' log.txt

開始と終了のパターンを指定して範囲処理ができます。ログの特定範囲だけ抽出するときとか便利。

Tips・注意点

バックアップは必須

-iオプションでファイルを直接編集する際は、必ず-i.bakのようにバックアップを取る習慣をつけましょう。取り返しのつかないミスを防げます。

1
2
# 安全な編集方法
sed -i.bak 's/old/new/g' important.txt

正規表現のエスケープに注意

sedでは、正規表現の特殊文字(., *, [, ]など)を文字として扱いたい場合はバックスラッシュでエスケープが必要です。

1
2
# ドット(.)を置換したい場合
sed 's/\./DOT/g' file.txt

macOSとLinuxの違い

macOSのsedは若干動作が違います。特に-iオプションはmacOSでは-i ''のように書く必要があります。

1
2
3
4
5
# macOS
sed -i '' 's/old/new/g' file.txt

# Linux
sed -i 's/old/new/g' file.txt

パイプとの組み合わせが強力

sedは標準入力から読み込めるので、パイプで他のコマンドと組み合わせると超強力です。

1
cat log.txt | grep ERROR | sed 's/ERROR/[ERROR]/g'

実践的な使い方

設定ファイルの一括編集

設定ファイルのパラメータを一括変更する場合に便利です。

1
2
3
4
5
6
7
# Apache設定のポート番号を変更
sed -i.bak 's/Listen 80/Listen 8080/g' /etc/apache2/apache2.conf

# 複数の設定を同時変更
sed -i.bak -e 's/ServerName old.example.com/ServerName new.example.com/g' \
           -e 's/DocumentRoot \/var\/www\/old/DocumentRoot \/var\/www\/new/g' \
           httpd.conf

ログファイルの加工

ログから必要な情報だけを抽出・整形する。

1
2
3
4
5
6
7
8
# タイムスタンプを削除
sed 's/^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\} //' app.log

# IPアドレスをマスク
sed -E 's/([0-9]{1,3}\.){3}[0-9]{1,3}/XXX.XXX.XXX.XXX/g' access.log

# エラー行だけ抽出して整形
sed -n '/ERROR/s/.*ERROR: //p' system.log

バッチファイル編集

複数ファイルに対して同じ置換処理を実行。

1
2
3
4
5
6
7
# カレントディレクトリの全.txtファイルを置換
for file in *.txt; do
    sed -i.bak 's/old/new/g' "$file"
done

# findと組み合わせて再帰的に処理
find . -name "*.conf" -exec sed -i.bak 's/old/new/g' {} \;

CSVデータの整形

1
2
3
4
5
6
7
8
# カンマをタブに変換
sed 's/,/\t/g' data.csv

# 特定の列を削除(例:2列目)
sed -E 's/^([^,]*),([^,]*),/\1,/' data.csv

# ダブルクォートを削除
sed 's/"//g' data.csv

まとめ

sedコマンドのポイントをおさらいしましょう。

  • 基本置換: s/old/new/ でシンプルに置換できる
  • グローバル置換: gフラグで行内すべてを置換
  • インプレース編集: -i.bakでバックアップを取りながら安全に編集
  • 行の削除: dコマンドで不要な行を削除
  • パターン指定: 正規表現で柔軟な検索・置換が可能
  • 複数処理: -eで複数のスクリプトを同時実行
  • 拡張正規表現: -Eでより高度なパターンマッチ

sedはシェルスクリプトでのテキスト処理に欠かせないツールです。最初は難しく感じるかもしれませんが、基本的な置換から始めて、徐々に複雑なパターンにチャレンジしていくと、その便利さに気づくはず。ログ処理や設定ファイルの編集で、めっちゃ役立ちますよ!