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

Perl regex: How to capture groups in piped text?

我期待

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

成为:

aa

因为$1指的是第一个捕获的组,恰好是"a"。

但是上面的代码输出:

(a b c)(a b c)

我做错了什么?

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

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

然后使用带有 /g 的标量上下文来遍历所有匹配项

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

或使用列表上下文,以便正则表达式 returns 一次匹配所有,

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