据我了解,$&
这是最后找到的捕获组。如果只有一个捕获组,为什么不返回相同的两个变量呢?例如:
$ 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" #
在这里会发生什么)。