複数ファイルの文字列置換

あるディレクトリ内にあるファイルすべての文字列を置換したいことはよくあります。Windows だったら適したフリーウェアがいくつかみつかりますが*1Unix だとパイプ文化だからかこれといった定番がありません。

find と sedシェルスクリプトを組み合わせればなんとかいけるのですが(どこがパイプ文化やねん)これまで Perl で Path::Class 使ったりしたスクリプトをいちいち書いていました。

定番たる書き方ないかなぁと思ってネットを漁ってたらすばり情報がありました。

Perl のワンナイラーは敬遠してたんですがこれはさすがにいいなぁと思いました。オプション「-i」,覚えておこうと思います。

回答編のものだと文字列が含まれないファイルも触りそうなので,私の場合,

% grep -lr 'HTTP_POST_VARS' * \
  | xargs perl -i -p -e 's/HTTP_POST_VARS/_POST/g'

のようにして使っています(あえて2行にわけてますがもちろん1行で OK)。

grep の -l オプションは GNU grep でのオプションで,指定した文字列が含まれる「ファイル名だけ」を出力するものです。で,xargs で行→引数化変換しています。ヒットするファイルが多すぎるとうまくないかもですが。

*1:私はDevas を使っています;いいものあったら教えて