0

我希望这只会捕获和打印parens中定义的组,而是打印整行。如何仅捕获和打印括号中的组?

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

我想要打印的内容:cd

它实际打印的内容:abcdef

怎么修?

4

2 回答 2

2

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

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

或者

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

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

于 2013-07-10T18:36:56.297 回答
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|/| /将使用管道作为正则表达式的分隔符来匹配字符。

于 2013-07-10T18:33:34.010 回答