![vim の置換と perl の pie の置換の変換](https://rvso.com/image/1316127/vim%20%E3%81%AE%E7%BD%AE%E6%8F%9B%E3%81%A8%20perl%20%E3%81%AE%20pie%20%E3%81%AE%E7%BD%AE%E6%8F%9B%E3%81%AE%E5%A4%89%E6%8F%9B.png)
test.txtというファイルがあり、そこには
home -> range
vimでファイルを編集してコマンドを実行すると、%s/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g
ファイルは次のように変換されます。
range ::= home ;
それが私の望みです。しかし、私が走れば
perl -pi -e 's/^\(.*\)->\(.*\)$/\2 ::= \1 ;/g' test.txt
同じ結果になるはずだと思うのですが、変更はありません。何が間違っているのか誰か教えてもらえますか? 何かをエスケープする必要があるのではないかと思いますが、あらゆるエスケープの組み合わせを試してみました... さらに、2 つの形式間の変換に関する一般的なルールも知りたいです...
答え1
Perl ではキャプチャ括弧をエスケープしません。また、キャプチャ変数には \1,\2 ではなく $1,$2 を使用するのが一般的です。
perl -pi -e 's/^(.*)->(.*)$/$2 ::= $1 ;/g' test.txt
残念なことに、正規表現多くの一般的なツール (vim、sed、awk、perl) で使用される (RE) はすべて微妙に異なります。一部のツールには、Perl RE、POSIX 基本 RE (BRE)、または POSIX 拡張 RE (ERE) を使用するオプションがあります。
perldoc perlre
置換式の置換部分における$1
vsについてこう言っている\1
次のような書き方に慣れすぎている人もいます:
$pattern =~ s/(\W)/\\\1/g;
これは、sed 中毒者にショックを与えないように、置換の RHS として継承されていますが、これはよくない習慣です。PerlThink では、"s///" の右側は二重引用符で囲まれた文字列であるためです。通常の二重引用符で囲まれた文字列の "\1" は、コントロール A を意味します。"\1" の通常の Unix の意味は、"s///" に間に合わせで組み込まれています。ただし、これを習慣にすると、"/e" 修飾子を追加するときに問題に巻き込まれます。