2026年8月12日
2026年8月12日
sedコマンドでテキストを置換する方法
はじめに
sed(Stream EDitor)は、テキストストリームを行単位で編集する非対話型エディタです。設定ファイルの一括置換、ログから不要部分の削除、スクリプト内の定型処理など、サーバー運用の自動化には欠かせない存在です。
vimなどの対話的エディタと違い、コマンド一行でファイル全体を編集できるため、Ansibleやシェルスクリプトの中でも頻繁に使われます。
症状・背景
sed が必要になる主な場面:
- 設定ファイル内の特定パラメータを一括で書き換えたい
- ログから機密情報をマスクして外部に共有したい
- 複数ファイルの改行コードやエンコーディング関連の文字を整形したい
- スクリプトでテンプレートファイルから動的に設定を生成したい
手順・設定方法
ステップ1: 基本の置換構文
# 文字列を置換して標準出力に表示
sed 's/old/new/' file.txt
# 全ての出現を置換(g: global)
sed 's/error/ERROR/g' app.log
# ファイルを直接書き換え(-i: in-place)
sed -i 's/127.0.0.1/192.168.1.10/g' /etc/hosts
# バックアップ付きで上書き
sed -i.bak 's/listen 80/listen 8080/' /etc/nginx/nginx.conf
ステップ2: 行の削除・表示制御
# 特定行を削除(5行目を削除)
sed '5d' file.txt
# 範囲削除(10行目から20行目)
sed '10,20d' file.txt
# パターンにマッチする行を削除
sed '/^#/d' /etc/ssh/sshd_config
# 空行を削除
sed '/^$/d' file.txt
ステップ3: 正規表現と区切り文字
# 区切り文字を変更(パスの置換に便利)
sed 's|/var/www/old|/var/www/new|g' config.php
# 後方参照(マッチ部分を保持して加工)
sed -E 's/(.+)@example\.com/\1@example.org/g' users.txt
# 行頭・行末の編集
sed 's/^/ /' code.txt # 各行頭にインデント追加
sed 's/[ \t]*$//' file.txt # 行末の空白を削除
# 大文字小文字変換
sed 's/.*/\U&/' lower.txt # 全て大文字に
ステップ4: 実践的な使い方
# 特定行のみ置換(3行目のみ)
sed '3 s/old/new/' file.txt
# パターン一致行のみ置換
sed '/^Server/ s/192.168.1.1/10.0.0.1/' config.ini
# 複数コマンドを連結(-e)
sed -e 's/foo/FOO/g' -e 's/bar/BAR/g' file.txt
# ログのIPアドレスをマスク
sed -E 's/([0-9]+\.){3}[0-9]+/XXX.XXX.XXX.XXX/g' access.log
# Apache設定でDocumentRootを書き換え
sed -i 's|^\(\s*DocumentRoot\s*\).*|\1/var/www/new|' /etc/apache2/sites-available/000-default.conf
注意事項
-iオプションは元ファイルを直接変更するため、必ず-i.bakでバックアップを取る- macOSのsedはBSD版で
-iの挙動が異なる(-i ''のように引数が必須) - 区切り文字
/は対象テキストに含まれる場合|や#に変更すると可読性が上がる - 複雑な置換はawkやperlの方が読みやすいことが多い
まとめ
1. 基本置換: sed 's/old/new/g' で文字列を一括置換
2. 直接編集: -i.bak でバックアップを取りつつ上書き保存
3. 行削除: d コマンドで行や範囲を削除
4. 正規表現: -E で拡張正規表現、\1 で後方参照
5. 複数処理: -e で複数コマンドを連結実行できる
関連記事: