Edited at

Perl ワンライナーで複数行置換

More than 3 years have passed since last update.

Perlのワンライナーで複数行置換しようと思って少し苦労したので自分用メモ。

PerlはPerl5です。


複数行置換するためのワンライナー

まず基本形はこの書き方。

$ cat filename | perl -0pe "s/aaa[\r\n ]+bbb/ccc\nddd/gm"

これで、aaa改行bbbがccc改行dddに置換されます。

ネットやQiitaで色々試しましたが、これ以外はうまくできなかった……

改行コード回りが微妙な感じでした。


エスケープのまとめ

エスケープは細かいところ覚えられないので、メモっておきます。

最初ワンライナーのところをシングルクォートでやっていたのですけど、途中でダブルクォートにしてやりなおし。というのも、置換する対象がシングルクォート含むことが多いのでそうしておきました。

Perlワンライナーのダブルクォート内に書く正規表現のエスケープはこんなルール。

( ⇒ \(

) ⇒ \)

/ ⇒ \/

. ⇒ \.

" ⇒ \"

$ ⇒ \x24

元の文字列を、以上のルールでエディタで一括置換して使っています。

例えばこうなります。

$.ajax({url:'http://localhost/',type:"GET"});

↓エスケープする

\x24\.ajax\({url:'http:\/\/localhost\/',type:\"GET\"}\);

↓正規表現にいれる

"s/aaa/\x24\.ajax\({url:'http:\/\/localhost\/',type:\"GET\"}\);/gm"