为什么这个Perl捕获不起作用

时间:2013-07-10 18:31:04

标签: regex perl

我希望这能捕获并打印仅在parens中定义的组,而是打印整行。如何在parens中捕获和打印该组?

echo "abcdef" | perl -ne "print $1 if /(cd)/ "

我想要打印的内容:cd

它实际打印的内容:abcdef

如何解决?

2 个答案:

答案 0 :(得分:2)

在perl命令中,您必须使用单引号或保护变量:

echo "abcdef" | perl -ne "print \$1 if /(cd)/"

echo "abcdef" | perl -ne 'print $1 if /(cd)/'

在双引号中,shell展开$ 1。

答案 1 :(得分:1)

您问题的即时修复是将双引号更改为单引号,如下所示:

       $ echo abcdef | perl -ne 'print $1 if /(cd)/'
       cd

使用双引号,shell环境会解释您的不受保护的变量$ 1,在您的环境中,该变量显然会计算为空字符串。所以perl只接收命令print if /(cd)/,这是一个隐含的命令print $_ if /(cd)/,它打印整行。

你也可以使用这样的受保护变量:

       $ echo abcdef | perl -ne "print \$1 if /(cd)/"
       cd

请注意,使用不同分隔符(/和/除外)的匹配需要以m关键字开头,而不是使用缩写形式。但在你的情况下,这并不重要,但在使用匹配时,通常需要注意一些事项,例如m | / |将使用管道匹配/字符作为正则表达式的分隔符。