Command-Line

Perl 命令行正則表達式修改所有模式匹配

  • November 11, 2018

我正在嘗試對perl命令行中的匹配模式使用一些算術。我能夠為一場比賽做到這一點,但不是全部。

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

我理解這裡$&指的是第一個匹配的數字1。我需要做什麼才能添加1到所有數字?是否有一個類似於$&代表所有匹配模式的變數?或者需要修改正則表達式以匹配多個數字。

對於給定的輸入,我期望輸出類似於

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

g替換標誌將使 Perl 為輸入行上的每個非重疊匹配應用表達式。

Nitpick:這裡實際上沒有涉及擷取組(原始問題提到了擷取組)。Perl 變數$&是“由最後一次成功的模式匹配匹配的字元串”。這與引用對應擷取組匹配的字元串(帶括號的表達式)的 eg 等$1不同。$2中沒有擷取組\d+,但您可以使用s/(\d+)/$1+1/ge它,它確實使用單個擷取組。

s/(\d+)/$1+1/ge結果和結果之間沒有區別s/\d+/$&+1/ge。在這個簡短的內嵌 Perl 腳本中,您選擇使用其中一個沒有區別,但通常您希望避免$&在執行許多正則表達式操作的較長 Perl 程序中使用,至少在使用較舊的 Perl 時釋放。

來自perldoc perlvar(我的重點):

性能問題

傳統上,在 Perl 中,任何使用三個變數中的任何一個$``,$&或者$’ (或它們的use English`等價物)在程式碼中的任何地方,都會導致所有後續成功的模式匹配複製匹配的字元串,以防程式碼隨後訪問其中一個變數. 這對整個程序造成了相當大的性能損失,因此通常不鼓勵使用這些變數。

$$ … $$ 在 Perl 5.20.0 中,預設啟用了一個新的寫時複製系統,它最終修復了這三個變數的所有性能問題,並使它們在任何地方都可以安全使用。

引用自:https://unix.stackexchange.com/questions/481073