すべてのパターン一致を修正するPerlコマンドライン正規表現

すべてのパターン一致を修正するPerlコマンドライン正規表現

perlコマンドラインでパターンマッチングにいくつかの算術を使用しようとしています。 1つのゲームではできますが、すべてのゲームではできません。

str="a1b2c3"
perl -pe 's/\d+/$&+1/e'  <<<"$str"
a2b2c3

私はこれが$&最初の一致する数値を意味することを理解しています11すべての数字を追加するにはどうすればよいですか?$&一致するすべてのパターンを表す同様の変数がありますか?または、複数の数字に一致するように正規表現を変更する必要があります。

与えられた入力に対して、出力は次のようになると予想されます。

a2b3c4

答え1

str="a1b2c3"
perl -pe 's/\d+/$&+1/ge' <<<"$str"

g置き換えられたフラグは、Perlが入力ラインで重ならないすべての一致に式を適用するようにします。

Nitpicky:実際にここに関連するキャプチャグループはありません(元の質問では、キャプチャグループに言及しました。)。 Perl変数$&は、「最後に成功したパターンマッチと一致する文字列」です。これは、対応するキャプチャグループ(角かっこ表現)と一致する文字列を参照するeg$1およびetcとは異なります。$2にはキャプチャリンググループはありませんが、単一のキャプチャリンググループを使用するものを\d+代わりに使用できます。s/(\d+)/$1+1/ge

その結果、s/(\d+)/$1+1/geあまり違いはありません。この短いインラインPerlスクリプトでは、どちらを選択しても違いはありません。しかし、通常、多くの正規表現操作を実行する長いPerlプログラムでは、少なくとも古いスクリプトを使用している場合はs/\d+/$&+1/geこれを避けたいと思います。$&Perlはそのままリリースされました。

perldoc perlvar(私のハイライト)から:

パフォーマンスの問題

伝統的に、Perlはコードのどこにでもこれら3つの変数またはそれに対応する変数を使用していました$`$&$'use Englishその後のすべての成功したパターン一致が、一致する文字列のコピーを生成するようにします。、コードがその後これらの変数のいずれかにアクセスする場合。これにより、プログラム全体のパフォーマンスが大幅に低下するため、通常はこれらの変数を使用しないことをお勧めします。

[...]

Perl 5.20.0 では、新しい Copy-On-Write システムがデフォルトで有効になっています。最後に、これら3つの変数のパフォーマンス問題をすべて解決しました。、どこでも安全に使用できるようにしてください。

答え2

zsh実際にシェル(<<<から派生していますが、それ以降複数の異なるシェルにコピーされた非標準演算子)を使用している場合は、これを呼び出すzsh必要はありません。perl

あなたはできます:

set -o extendedglob # for (#m) below
printf '%s\n' ${str//(#m)<->/$((MATCH+1))}

どこ

  • (#m)フルマッチキャプチャをオンにします(s$MATCHと同じ)。perl$&
  • <-> 任意の10進数シーケンスと一致します(同様<5-12>ですが制限はありません)。

関連情報