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に食わせて処理。
まぁいいか。

投稿者 his : 2004年10月30日 14:27
このエントリーのトラックバックURL: http://hoop.euqset.org/blog/mt-tb2006.cgi/744
コメント

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

Posted by: ねぎ : 2004年10月30日 14:54

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

Posted by: bae : 2004年11月 1日 01:52
コメントする









名前、アドレスを登録しますか?





画像の中に見える文字を入力してください。