Regular-Expression
區別1和d_1一個nd1 and& Perl 如果只找到一個擷取組
據我了解,
$&
是最後發現的擷取組。如果只有一個擷取組,為什麼不返回相同的兩個變數?例如:$ echo "key: value" | perl -ne "s/([a-z]+)(?=:)/\"$1\"/; print;" "": value $ echo "key: value" | perl -ne "s/([a-z]+)(?=:)/\"$&\"/; print;" "key": value
perl
的特殊變數記錄在perldoc perlvar
.如果您的尋呼機是,您可以通過搜尋(在行首)
less
到達 about 部分。$&``^\s*\$&``$&
或者只是
perldoc -v '$&'
用來提取關於$&
變數的特定部分:$& The string matched by the last successful pattern match (not counting any matches hidden within a BLOCK or "eval()" enclosed by the current BLOCK). See "Performance issues" above for the serious performance implications of using this variable (even once) in your code. This variable is read-only and dynamically-scoped. Mnemonic: like "&" in some editors.
所以它不包含任何擷取組擷取的內容,而是整個正則表達式匹配的內容。
在任何情況下,您的問題是
$1
外殼程序將其擴展到其第一個位置參數(看起來它沒有在您的情況下設置),而$&
在$&
您的外殼程序中不是有效的變數名。您可能希望在其中使用單引號,從而
$
在外殼中失去其特殊含義:echo 'key: value' | perl -pe 's/([a-z]+):/"$1":/'
echo 'key: value' | perl -pe 's/[a-z]+(?=:)/"$&"/'
更一般地說,您幾乎總是希望在程式碼參數或任何其他語言解釋器 ( , , , …) 周圍使用單引號(強引號),這不僅是因為這些語言通常涉及恰好也對 shell 特殊的字元,但也因為,如果不這樣做,會在那裡執行 shell 擴展(就像您在此處擴展為第一個位置參數的內容),這可能很快成為程式碼注入漏洞(想想如果例如這裡包含)。
perl``sed -e``awk``python -c``sh -c``$1``$1``/;system "reboot" #