2004年10月30日土曜日

いつも探してしまうperlでのファイル内文字列置換(その3)


いつも探してしまうperlでのファイル内文字列置換(その2)の続き?



よく考えたら(考えなくても(^^;)、複数行にマッチして、その行を特定のパターンに置き換えるだけなら、patchと言う強い武器があった。(ちょっと条件は付くが)



ここに、aaaa.txtと言うファイルがある。


<!--hogehoge-->
<!--hogehoge-end-->

この2つのタグの間に何かを挟みたいとする。

また、この2つのタグは対象ファイルに1回しか現れないとする。

対象ファイルが一つならすぐ修正だが、同じ変更を大量のファイルにやる場合が問題。





このaaaa.txtを下記のように書き換えたいとする。


<!--hogehoge-->
abc def ghi
jkl mno pqr
stu vwx yz
<!--hogehoge-end-->

上記のファイルをbbbb.txtと言う名前で作る。

作った後でdiff -pをとる。

$ diff -p aaaa.txt bbbb.txt
*** aaaa.txt Sat Oct 30 14:09:29 2004
--- bbbb.txt Sat Oct 30 14:09:49 2004
***************
*** 1,2 ****
--- 1,5 ----
<!--hogehoge--*gt;
+ abc def ghi
+ jkl mno pqr
+ stu vwx yz
<!--hogehoge-end-->

間に挟む処理が書かれている。ここで、

diff -p aaaa.txt bbbb.txt > ab.patch

とかで、patchfileを作成する。



後はfind -execで順にpatchを当てる...と良いはずだが、なんだかうまくいかない(--;

結局find -printで出た対象ファイル名をちょっと加工してshellに食わせて処理。

まぁいいか。


2 件のコメント:

  1. diffを使うのなら--edでedマクロ形式で出力すると良いかも知れませんね。

    返信削除
  2. 似たようなことを http://www.luky.org/opensrc/ でやってました。だだし、タグは一つで置き換えるだけ、しかも真面目にファイルオープンしてソース読み込み。我ながら苦労してる。。patchがあったとは。。

    返信削除