価値を高めたい。例えば
- ジェリー1
- ジェリー2
- ジェリー3
- ジェリー4
それを変えたい。
- ジェリー2
- ジェリー3
- ジェリー4
- ジェリー5
どうすれば変更できますか?
すべてに対して正規表現を乱用しようとしないでください。
設計上、正規表現はカウントをサポートしないようになっています。理由は簡単です。これを行うには、少なくともタイプ 2 言語が必要ですが、処理はタイプ 3 (「通常の」) 言語よりもはるかに複雑です。
詳細については、ウィキペディアを参照してください: https://en.wikipedia.org/wiki/Chomsky_hierarchy
したがって、定義上、カウントを完全にサポートすると、それはおそらく通常の言語ではなくなります。
perl 拡張正規表現など、この特定の問題を解決できる拡張機能があります。しかし本質的に、これらはもはや正規表現ではありませんが、外部関数を呼び出して作業を行います。
次のperl 拡張正規表現は、あなたが望むことをするはずです:
s/(-?\d+)/$1 + 1/eg
が、基本的にはマッチング部分のみ正規表現、置換はPerlなのでチューリング完了。このe
フラグは、正規表現置換文字列としてではなく、Perl によって右側の部分を評価する必要があることを示します。
もちろん、このトリックは他のほとんどすべての正規表現エンジンで実行できます。一致し、増分を計算してから、一致を新しい値に置き換えます。
完全な perl フィルターのデモ:
> echo 'Test 123 test 0 Banana9 -17 3 route66' | perl -pe 's/(-?\d+)/$1+1/eg'
Test 124 test 1 Banana10 -16 4 route67
このp
フラグにより、perl は標準入力を読み取り、プログラムを各行に適用し、結果を出力します。そのため、実際のスクリプトは置換のみで構成されています。これが、Perl が UNIX スクリプトで非常に人気がある理由です。このフィルターを一連のファイル全体にまとめて適用することもできます (-i
インプレース変更については、perlrun
マニュアル ページを参照してください)。そのため、一連のファイル全体を適切に変更するには (バックアップには接尾辞が付きます.bak
):
perl -p -i .bak -e 's/(-?\d+)/$1+1/eg' <filenames>