こんにちは、Bash玄(ばっしゅげん)です。
サーバー構築やスクリプト作成、日々のログ調査で「設定ファイルのIPアドレスを一括変更したい」「ログから不要なコメント行や空行を一瞬で削りたい」という場面は日常茶飯事です。手作業でエディタを開いて1行ずつ修正するのは時間の無駄ですし、オペレーションミスの原因にもなります。そこで大活躍するのが sed(stream editor)コマンドです。
この記事では、sed の基本構文から実務で頻出するオプション一覧、さらに現場で即コピペして使える18の実践パターン(文字列置換・行削除・ファイル直接上書き -i など)を徹底解説します。
1. 最短で動かす基本構文(sコマンド)
sed の最も基本的かつ頻繁に使う操作が、文字列を置換する s(substitute)コマンドです。
# 基本構文:ファイル内の文字列を置換して標準出力に表示
sed 's/検索文字列/置換文字列/g' target.txt
デフォルトでは、sed は元のファイルを直接書き換えず、変換結果を標準出力(ターミナル画面)に出力します。これにより、元のファイルを壊す心配なく置換結果を事前に確認できます。
置換結果に問題がないことを確認した上で、元のファイルを直接上書き保存したい場合は -i(in-place)オプションを使用します。
# ファイルを直接上書き保存する(in-place 編集)
sed -i 's/検索文字列/置換文字列/g' target.txt
# バックアップ(target.txt.bak)を作成してから上書き保存する安全な書き方
sed -i.bak 's/検索文字列/置換文字列/g' target.txt
実務では、誤った置換による設定破壊を防ぐため、「まずは -i なしで出力確認 → 問題なければ -i.bak または -i で本番反映」が鉄則の流れです。
2. sed 主要オプション一覧・早見表
sed を使いこなす上で覚えておくべき主要オプションを一覧表にまとめました。
| オプション | 機能・役割 | 実用例 |
|---|---|---|
-i[拡張子] | ファイルを直接上書き保存(バックアップ作成も可能) | sed -i.bak 's/foo/bar/g' file.txt |
-e | 複数の置換・編集スクリプトを連続して実行 | sed -e 's/a/b/g' -e 's/c/d/g' file.txt |
-n | 標準の自動出力を抑制(p コマンドと併用して抽出) | sed -n '1,10p' file.txt |
-E(または -r) | 拡張正規表現(ERE: +, ?, |, () など)を有効化 | sed -E 's/[0-9]+/NUM/g' file.txt |
-f | 編集スクリプトを外部ファイルから読み込んで適用 | sed -f rules.sed file.txt |
3. 実務で使える頻出パターン集(コピペ実例18選)
現場のシェルスクリプトやサーバー運用でそのままコピペして使える実践パターン18選をカテゴリ別にご紹介します。
3.1 文字列の置換パターン(全置換・大文字小文字無視・パス置換)
① 行内で最初に一致した文字列のみ置換
末尾に g を付けないと、各行の「最初に見つかった1箇所」だけが置換されます。
# 最初に見つかった apple のみ orange に置換
echo "apple banana apple" | sed 's/apple/orange/'
# 出力結果: orange banana apple
② 行内のすべての一致文字列を一括置換(gフラグ)
行内に複数回出現する文字列をすべて置換するには、グローバル置換フラグ g を付与します。
# すべての apple を orange に置換
echo "apple banana apple" | sed 's/apple/orange/g'
# 出力結果: orange banana orange
③ 大文字・小文字を区別せずに置換(Iフラグ)
大文字小文字の揺れがあるログやテキストには、大文字小文字無視フラグ I(GNU sed)を併用します。
# ERROR, error, Error をすべて [WARN] に置換
echo "ERROR: error occurred" | sed 's/error/[WARN]/gI'
# 出力結果: [WARN]: [WARN] occurred
④ スラッシュを含むURL・ファイルパスの置換(代替デリミタ)
パスやURLに / が含まれる場合、区切り文字を # や @、| に変更するとエスケープ不要で可読性が上がります。
# 区切り文字に # を使用してURLのパスを置換
echo "http://example.com/api/v1" | sed 's#http://example.com/api/v1#https://example.com/api/v2#g'
# 出力結果: https://example.com/api/v2
⑤ 特定の行番号のみ置換s の前に行番号を指定すると、その行だけを対象に置換処理を実行します。
# 2行目の localhost だけを 127.0.0.1 に置換
sed '2s/localhost/127.0.0.1/' hosts.txt
⑥ 指定した行範囲(例: 10行目〜20行目)のみ置換
コンマ , で開始行と終了行を指定することで、特定のブロック内だけを置換できます。
# 10行目から20行目の間にある disable を enable に置換
sed '10,20s/disable/enable/g' app.conf
3.2 行の削除・抽出パターン(先頭・最終・空行・コメント行)
⑦ 先頭行(ヘッダー行)を削除(1d)
CSVデータなどのヘッダーを除去してデータ行のみをパイプで後続処理に渡す際によく使われます。
# 1行目を削除して出力
sed '1d' users.csv
⑧ 最終行(フッター行)を削除($d)$ はファイルの末尾行を表す特殊記号です。
# 最終行を削除して出力
sed '$d' summary.txt
⑨ 空行を削除(/^$/d)
行頭 ^ と行末 $ が連続する空行を削除します。
# すべての空行を削除
sed '/^$/d' input.txt
⑩ コメント行・空行を同時に削除
設定ファイルから # で始まるコメント行と空行を一掃し、有効な設定行だけを抽出します。
# コメント行(#始まり)と空行を両方削除
sed -e '/^#/d' -e '/^$/d' /etc/nginx/nginx.conf
⑪ 特定パターンを含む行のみを抽出(-n と p)-n で自動出力をオフにし、/パターン/p で合致した行のみを出力します(grep と同様の処理)。
# [FATAL] または [ERROR] を含む行のみを抽出
sed -n '/\[ERROR\]/p' /var/log/app.log
⑫ 指定した行範囲(例: 5〜10行目)のみを抽出
# 5行目から10行目までを抽出表示
sed -n '5,10p' /var/log/syslog
3.3 行の先頭・末尾に文字を追加するパターン
⑬ 各行の先頭に文字を追加(^の置換)
行頭を表す正規表現 ^ を置換対象にすることで、プレフィックスを付与できます。
# すべての行の先頭に "# " を追加して一括コメントアウト
sed 's/^/# /' config.env
⑭ 各行の末尾に文字を追加($の置換)
行末を表す正規表現 $ を置換対象にして、カンマやセミコロンを付与します。
# すべての行の末尾にカンマを追加
sed 's/$/,/' id_list.txt
3.4 複数ファイルの一括置換パターン(find × sed / xargs連携)
⑮ カレントディレクトリ内の同名拡張子を一括置換
シェルグロブ *.conf を渡すことで、カレントディレクトリの対象ファイルをまとめて直接更新します。
# カレントディレクトリの全 .conf ファイル内の旧ドメインを新ドメインに上書き
sed -i 's/example.org/example.com/g' *.conf
⑯ find × xargs と連携してサブディレクトリを含め再帰的に一括置換find で抽出したファイルを xargs に渡し、安全・高速に一括置換します。
# サブディレクトリを含むすべての .php ファイルで特定関数名を一括置換
find . -type f -name "*.php" -print0 | xargs -0 sed -i 's/old_function(/new_function(/g'
3.5 変数展開・拡張正規表現パターン
⑰ シェル変数を埋め込んだ動的置換(ダブルクォート囲み)
シングルクォート内では変数が展開されないため、変数を含める場合は外側をダブルクォート "..." で囲みます。
TARGET_IP="192.168.10.50"
# シェル変数を展開して設定ファイルに書き込み
sed -i "s/SERVER_IP=.*/SERVER_IP=${TARGET_IP}/" server.conf
⑱ 拡張正規表現を用いた日付フォーマット変換(-Eオプション)-E オプションを使うことで、グループ化 () や後方参照 \1, \2, \3 がシンプルに扱えます。
# YYYY-MM-DD 形式を YYYY/MM/DD 形式に変換
echo "2026-08-30 release" | sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\1\/\2\/\3/g'
# 出力結果: 2026/08/30 release
4. よくあるエラー・落とし穴と対処法
sed コマンドの実務でよく遭遇する3大トラブルと、その解決策をまとめました。
4.1 macOS(BSD sed)と Linux(GNU sed)での -i の挙動違い
Mac(macOS標準のBSD sed)で sed -i 's/a/b/g' file.txt を実行すると、sed: 1: "file.txt": invalid command code f というエラーが発生します。
BSD sed の -i はバックアップの拡張子を引数として要求するため、バックアップ不要な場合は空文字 '' を渡す必要があります。
# Linux (GNU sed): そのまま実行可能
sed -i 's/old/new/g' file.txt
# macOS (BSD sed): 空の拡張子 '' が必須
sed -i '' 's/old/new/g' file.txt
# OS共通で動く安全な記述(バックアップ .bak を作成)
sed -i.bak 's/old/new/g' file.txt
4.2 デリミタ(スラッシュ /)のエスケープ漏れ
URLやディレクトリパスなどの / を含む文字列を s/.../.../ で置換しようとすると、構文エラーになります。
区切り文字(デリミタ)は / 以外に # や @、%、_ など任意の1文字に変更可能です。パスを扱う際は常に s#old#new#g のように代替デリミタを使う習慣をつけましょう。
4.3 シングルクォートによる変数展開ミス
Bashではシングルクォート '...' 内の文字列はリテラルとして扱われ、$VAR などの環境変数は展開されません。
変数を渡したい場合は必ずダブルクォート "..." を使用し、変数自体に / などの特殊記号が含まれる可能性がある場合はデリミタも工夫してください。
5. まとめ & 関連記事
sed コマンドの要点を振り返ります:
- 基本は
s/検索/置換/g:まずは-iなしで標準出力に出して安全確認する。 - ファイル直接上書きは
-i(または-i.bak):OSによる挙動差(Linux vs macOS)に注意する。 - パス置換は代替デリミタ(
#や@):エスケープ地獄を回避して可読性を保つ。
テキスト処理やシェルスクリプトの自動化をさらに極めたい方は、以下の関連コマンドやピラー記事もぜひあわせてチェックしてみてください。
関連コマンド&ピラー記事
- 【Linuxコマンド一覧・早見表】実務で頻出する主要コマンド・オプション逆引き完全ガイド(ピラー記事)
- BashでCSVを扱う方法まとめ|読み込み・ループ・配列処理の実践例(ピラー記事)
- 【grepコマンド早見表】主要オプション一覧と実務で使える正規表現・検索パターン20選(サテライト記事)
- Bash cutコマンドの使い方徹底ガイド:データを効率的に分割・抽出する方法(サテライト記事)
- tr – 文字の変換・削除を行うコマンド(サテライト記事)
- awk – パターン処理とテキスト抽出・加工言語(サテライト記事)
- xargs コマンド|標準入力を引数に渡す・ find / grep との連携パターン(サテライト記事)

コメント