Perl正则表达式:如何在管道文本中捕获组?

时间:2015-01-02 19:01:24

标签: regex perl pipe regex-group

我期待

的输出
echo "(a b c)(a b c)" | perl -ne "/(a) b/g; print $1"

是:

aa

因为1美元是指第一个被捕获的群体,恰好是" a"。

但是上面的代码输出:

(a b c)(a b c)

我做错了什么?

1 个答案:

答案 0 :(得分:4)

首先在* nix下使用单引号,因为这不是您想要的:

echo "(a b c)(a b c)" | perl -MO=Deparse -ne "/(a) b/g; print $1"
LINE: while (defined($_ = <ARGV>)) {
  /(a) b/g;
  print $_;
}

然后使用带有/g的标量上下文迭代所有匹配

echo "(a b c)(a b c)" | perl -ne 'print $1 while /(a) b/g'

或使用列表上下文,因此正则表达式一次返回所有匹配项,

echo "(a b c)(a b c)" | perl -ne 'print /(a) b/g'