使用grep命名捕获组

时间:2017-06-01 09:06:46

标签: regex grep capture-group

我使用Unix grep。我想知道如何用它来处理命名的捕获组。

目前这就是我所拥有的:

echo "foobar" | grep -P "(?<q>.)ooba(?<w>.)"

所以从理论上讲,我有q=fw=r,但我不知道如何使用这些变量或将它们交给下一个命令(例如awk)通过管道

最后,我希望得到以下结果:

f r

上面的字符串只是一个例子。捕获组可以是任何地方,可以是任何数量,并且打印也可以是任何顺序。我之所以这样说,是因为我没有专门寻找提取字符串的最后一个和第一个字符的方法,而是一种从字符串中提取尽可能多的变量的方法。我知道使用-o\K(?<=some text).*?(?=some other text)这样的技巧,但这些只提取字符串的一部分而不是多个。

2 个答案:

答案 0 :(得分:2)

sed中有9个被捕获的群组受到限制。但是,gawk不是这种情况。

你提到的问题,“而是一种从字符串”中提取我想要的变量的方法。

如果你必须玩1-9组,那么

sed最适合这份工作。如果不是match的{​​{1}}函数,则gawk也有帮助。 (使用与Inian相同的正则表达式)

echo "foobar" | awk '{match($0,/^(.)(.+)(.)$/,a);print a[1],a[3]}'
f r

PS:如果处理的组数超过9,这是一种替代方法可能非常有用。此外,对于较少的数字,它可以正常工作。此外,还与awkNROFSFS变量紧密相关,因此格式化更容易。

答案 1 :(得分:1)

commentDelegate.updateComment(with: newCount) 无法单独打印捕获的组,但grep可以使用您的示例,

sed

字面意思是,匹配第一个字符 - 字符串的其余部分和最后一个字符。现在,您可以从echo "foobar" | sed 's/^\(.\)\(.\+\)\(.\)$/\1 \3/' f r .. \1表示法

访问各个捕获的群组

RegEx Demo

围绕大括号\n的原因是因为\默认使用BRE(基本RegEx)和 ERE(扩展RegEx),可以使用{ {1}}或sed标记。 -E -r不支持ERE,因此答案基本上通过POSIX

转义来模拟来自BRE的ERE令牌