sed で IP アドレスを置換する際のエスケープ処理について

sedコマンドでIPを置換する

Apache などの設定ファイルで特定の IP アドレスを制限する場合、グローバル IP アドレスが変更されると設定ファイルを手動で書き換える必要があります。この作業を効率化するために sed を使用したワンライナーで置換する方法を紹介します。

sed を使った IP アドレスの置換方法

例えば、以下のような設定ファイルの Require ip ディレクティブで指定されている IP アドレスを変更する場合を考えます。
変更対象の例 として、「/etc/httpd/conf.d/phpMyAdmin.conf」に特定のIPアドレスを許可する設定がある場合

# 192.0.2.1のIPアドレスの箇所を確認
$ grep 192.0.2.1 /etc/httpd/conf.d/phpMyAdmin.conf
Require ip 192.0.2.1

sed を使った置換コマンド

$ sudo sed -i 's/192\.0\.2\.1/203.0.113.5/g' /etc/httpd/conf.d/phpMyAdmin.conf

sed におけるエスケープの必要性

この sed コマンドでは 「置換前」の IP アドレスのドット (.)\.エスケープ していますが、「置換後」の IP アドレスにはエスケープを適用していません。その理由を解説します。

置換前の IP アドレスに \.(エスケープ)が必要な理由

sed では .****(ドット)は正規表現において「任意の1文字」を意味 します。そのため、192.0.2.1 のようにドットが含まれる IP アドレスをそのまま記述すると、

s/192.0.2.1/203.0.113.5/g

のようになり、
192x0x2x1
(x は任意の1文字)と一致してしまう可能性があります。

正確に 192.0.2.1 という文字列を検索・置換するためには、ドットを明示的にピリオドとして扱うように \. でエスケープする必要があります。

置換後の IP アドレスに \.(エスケープ)が不要な理由

sed では 置換後の文字列は通常のリテラル文字列として扱われる ため、

s/192\.0\.2\.1/203.0.113.5/g

と書いた場合、203.0.113.5 はそのままの文字列として挿入されます。ドットをエスケープする必要がないため、

s/192\.0\.2\.1/203.0.113.5/g

のように . のままで問題なく動作します。

置換コマンドの実行例

実際に sed で IP アドレスを変更する前に、以下のコマンドで結果を確認することをおすすめします。
実際に変更を行う場合は -i オプションを付けます。

$ sudo sed 's/192\.0\.2\.1/203.0.113.5/g' /etc/httpd/conf/httpd.conf | less

バックアップを取る方法

誤って設定を壊さないように、以下のように .bak 拡張子付きのバックアップを作成してから置換を行うのが安全です。
.bak 付きのファイルが元の状態のまま残るため、万が一問題が発生した場合に復元できます。

$ sudo sed -i.bak 's/192\.0\.2\.1/203.0.113.5/g' /etc/httpd/conf/httpd.conf

設定変更後の確認と適用

置換後に設定を反映するために、Apache の設定をテストし、再起動またはリロードを行います。

# 設定ファイルの文法チェック
$ sudo apachectl configtest

# Apache の設定を再読み込み
$ sudo systemctl reload httpd

まとめ

  • 置換前の IP アドレスは \. でエスケープする必要がある(正規表現における . をリテラルのピリオドとして扱うため)。
  • 置換後の IP アドレスはエスケープ不要(そのままの文字列として置換されるため)。
  • 変更前に sed の結果を less で確認すると安全。
  • -i.bak でバックアップを取ると、万が一の際に復元可能。
  • 変更後は apachectl configtest で文法チェックし、systemctl reload httpd で反映。

スポンサーリンク

0
0