ホームページ上の文字列検索・置換 05月03日, 2009
Net上には、Linuxの類似の記事やperlをめぐる一般論をよく見かけますし、魅力的なページも数多く、大変参考になります。しかし、OS X上に限定した記事は多くはないように思え、いざ何かで実際に利用しようとすると、他のOSの暗黙の前提となっている事項が理解できずに無駄に時間を過ごしてしまいます。ここでは、Leopardの perl-5.8.8 をターミナル.appから使う環境でスクリプトと遊んでいる身として、自分用メモの意味合いを中心にポツポツと書きとめていこうと思っています。
私は、ページのタグを手で素朴に入力しているので、メニューの表現変更などで全ページにわたって同一文字列を変更しなければならない際はかなり神経を使います。
$find ./ -type f -name \*.html -exec perl -ne ' if(/$word/) {$d="$ARGV$.\n$_";print $d}' {} \;
などで修正箇所を確認した上で、
$find ./ -type f -name \*.html -exec perl -i -pe 's/$SearchWord/$ReplaceWord/' {} \;
のようにして置換することが多いのですが、毎回この長いコマンドを手入力をしなくて済むように、しかも対話型で置換のスクリプトを用意しておきたいと思いたち、perlで遊んだものが下記です。File::Findを使って、findの場合と類似の処理をしています。バッファを使用して対話の中で元ファイルを書き直すことくらいは工夫したのですが、どうもperlらしくなく、Cのプログラムのようになってしまったのが幾分残念。でもまあ当面は使えそうです。
スクリプトには [検索開始ディレクトリ( default:./ )] 検索語、置換語を argumentに与えます。マッチ箇所を赤字で表示した後、置換の選択に入り、個々の候補について置換するか次に進むかを選びます。しばらくは、起動前にデータをbackupしておいた方が安心ですね。エンコードに関わる処置が万全ではないので、私の環境でないと動かないものと思われますが、Leopardでターミナル.appから呼ぶのならこのままで普通に動作するでしょう。
ついでに検索のみのものも挙げておきます。「原型」ではマッチ行が長い場合に不便なので、「別案」は表示をちょっとだけ工夫し、検索語直前の40カラム分(全角のみなら20文字)と直後40カラム分を切り取って表示するものです。ただ、検索語に正規表現を用いた場合でマッチ部分が長い場合や、そもそも検索語自身が長い場合については切り詰められずそのままが出力されます。要するに、マッチ部前方文字列($`)と後方文字列($’)を全角・半角を判断して左へ、あるいは右へ切り詰めているだけで、マッチ部そのもの($&)は操作していないためです。これを詰めると不便でしょう、たぶん。