如果只找到一个捕获组,则 $1 和 $& Perl 之间存在差异

如果只找到一个捕获组,则 $1 和 $& Perl 之间存在差异

据我了解,$&这是最后找到的捕获组。如果只有一个捕获组,为什么不返回相同的两个变量呢?例如:

$ echo "key: value" | perl -ne "s/([a-z]+)(?=:)/\"$1\"/; print;" 
"": value
$ echo "key: value" | perl -ne "s/([a-z]+)(?=:)/\"$&\"/; print;"
"key": value

答案1

perl的特殊变量记录在perldoc perlvar.

如果您的寻呼机是,您可以通过搜索(在行的开头)less到达有关 的部分。$&^\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由外壳扩展到它的第一个位置参数(看起来在你的情况下没有设置) while$&被单独留下,因为$&在你的 shell 中不是一个有效的变量名。

您希望在内部使用单引号,这$会在 shell 中失去其特殊含义:

echo 'key: value' | perl -pe 's/([a-z]+):/"$1":/'
echo 'key: value' | perl -pe 's/[a-z]+(?=:)/"$&"/'

更一般地说,您几乎总是想使用单个 (强的perl)或任何其他语言解释器 ( sed -e, awk, python -c, ...)的代码参数周围的引号sh -c,不仅因为这些语言通常涉及恰好对 shell 来说也是特殊的字符,而且还因为,如果不这样做的话,在那里执行 shell 扩展(就像您$1在此处扩展为第一个位置参数的内容一样),这可以很快成为代码注入漏洞(想想如果$1包含/;system "reboot" #在这里会发生什么)。

相关内容