Perlで文字列置換コマンド

便利なコマンドを覚えようコーナー(仮). 今回は文字列置換. 文字列置換にはsedという便利なコマンドがあるが, 今回はPerlを使う.

$ perl -p -i.bak -e 's/foo/bar/g' index.html

  • pは入力ファイルから一行ずつ取り出す. -iはファイルを修正, 上書きする. 続けて拡張子(.bak)を付けるとバックアップをとってくれる. -eは続けてスクリプトを記述するためのもので, あとはいつもの正規表現.

さて, これを複数ファイルについて同時に行いたい. こんなときはfindコマンドが有用だ.

$ find ./*.html -exec perl -p -i.bak -e 's/foo/bar/g' {} \;
findはもともと条件を満たすファイルを取得するコマンドだが, 続けて-execオプションを用いれば, その各ファイルにコマンドを適用できる. 今回はそれをperlによる置換とした.

  • exec引数の最後は\;で終える. {}が各ファイル名で置き換えられ, 実行される.

マスターしよう.

http://kazmax.zpp.jp/linux/lin_replace.html

findの練習問題として, ここで得た変更前のファイルと変更後のファイルの差分を全て表示するようなコマンドを考える. たぶんこんな感じ.

$ find *.py -exec diff {}.bak {} \;