いつも探してしまう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に食わせて処理。
まぁいいか。
diffを使うのなら--edでedマクロ形式で出力すると良いかも知れませんね。
返信削除似たようなことを http://www.luky.org/opensrc/ でやってました。だだし、タグは一つで置き換えるだけ、しかも真面目にファイルオープンしてソース読み込み。我ながら苦労してる。。patchがあったとは。。
返信削除