我希望这能捕获并打印仅在parens中定义的组,而是打印整行。如何在parens中捕获和打印该组?
echo "abcdef" | perl -ne "print $1 if /(cd)/ "
我想要打印的内容:cd
它实际打印的内容:abcdef
如何解决?
答案 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 | / |将使用管道匹配/
字符作为正则表达式的分隔符。