Regular-Expression

區別1和d_1一個nd1 and& Perl 如果只找到一個擷取組

  • February 5, 2021

據我了解,$&是最後發現的擷取組。如果只有一個擷取組,為什麼不返回相同的兩個變數?例如:

$ 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" #

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