1

我想打印命名的捕获,但我gclidsession正则表达式一旦匹配 gclid 就会退出:

echo '"https://example.com/foo/?gclid=abc1234gef76786" session="765dsfsdf7657657khkjh"' | perl -nE '/(?<gclid>gclid=[^&"#\s]*)|(?<session>session=.*)/&&say"gclid: $+{gclid} session: $+{session}"'

结果是:

gclid: gclid=abc1234gef76786 session:

但我想要:

gclid: gclid=abc1234gef76786 session: session="765dsfsdf7657657khkjh"

echo只是将要处理的数百万行中的一个示例行。

4

1 回答 1

2

那是因为您正在使用|运算符,因此当两个模式中的任何一个匹配时,正则表达式匹配就会停止。您可以.*在两种模式之间使用。放在\b前面session以确保单词边界:

perl -nE '/(?<gclid>gclid=[^&"#\s]*).*(?<session>\bsession=.*)/&&say"gclid: $+{gclid} session: $+{session}"'
于 2019-09-27T12:33:54.233 回答