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 で複数コマンドを連結実行できる

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ