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
のようになり、
(x は任意の1文字)と一致してしまう可能性があります。
192x0x2x1
正確に 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
で反映。
ディスカッション
コメント一覧
まだ、コメントがありません