sedで一括置換

この時代にsedなんか使っている人がいるんだかいないんだかですが、やっぱり軽くていいです。置換ソフトは数あれど、比較的巨大なファイルも難なく一発置換してくれるのが、sedです。grepなんかと一緒に使ったりします。結構使う頻度多いかもです。Jeditで6MB超のファイルを置換したらフリーズしてしまうのでサーバ上で置換しました。

sed -e s/<置換対象文字列>/<置換語の文字列>/g <置換対象ファイル> <置換後のファイル>

今回はMySQLのDBからダンプしたファイルのURLをすべて置換というので、使いました。

sed -e s/www.example.com/home.example.com/g DB.sql > DB2.sql

めちゃめちゃ軽いのですごくいいです。
同じファイルをそのまま置換する場合は-iで置換する。

sed -i s/www.example.com/home.example.com/ DB.sql

実際の書き方としてはこんな感じでよいです。

sed -e s/192.168.11.12/192.168.11.13/g /tmp/config.txt > /tmp/config.txt

ちなみに正規表現も使えます。
しかし、スラッシュを含んだ文字列の置換となると厄介。エスケープを2回してやらないと駄目です。

/home/user/wwwを/home/user1/wwwに変換する場合はこんな感じになります。
sed -e s/home\\/user\\/www/home\\/user1\\/www/g /tmp/config.txt > /tmp/config.txt

sedはさらにおかしな挙動があって、sedコマンドをphpに渡すときなんかは、sedに渡す時点で\\が\と解釈されることがあって、結果的に、

exec('sed -e s/home\\\\/user\\\\/www/home\\\\/user1\\\\/www/g /tmp/config.txt > /tmp/config.txt');

というバックスラッシュ4連続というおかしなことにしないとコマンド通りません。

Last update: 2016.03.09 (水)