繁体   English   中英

用grep命名捕获组

[英]Named capture groups with grep

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

目前,这是我所拥有的:

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

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

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

fr

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

sed有9个捕获组的限制。 但是, gawk并非如此。

您在Question中提到: “而是从字符串中提取所需数量的变量的一种方法”

如果您必须和1-9个小组一起玩,那么sed是最适合的工作。 如果不是这种情况, gawk match功能也将很有帮助。 (使用与Inian相同的正则表达式)

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

PS:如果与多于9人的团队打交道,这是一种替代方法可能真的很有用。 此外,还与awk的变量如NROFSFS紧密相关,因此格式化更加容易。

grep无法单独打印捕获的组,但是sed可以与您给出的示例一起使用,

echo "foobar" | sed 's/^\(.\)\(.\+\)\(.\)$/\1 \3/'
f r

字面意思是匹配第一个字符-字符串的其余部分和最后一个字符。 现在,您可以通过\\1 .. \\n表示法访问各个捕获的组,

正则演示

大括号周围的\\的原因是因为sed默认情况下使用BRE(基本RegEx)而不是 ERE(扩展RegEx),后者可以使用-E-r标志启用。 POSIX sed不支持ERE,因此基本上,答案是通过用\\转义来模拟BRE中的ERE令牌\\

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM