3

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

目前这就是我所拥有的:

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

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

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

f r

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

4

2 回答 2

2

grep无法单独打印捕获的组,但sed可以通过您给定的示例,

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

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

正则表达式演示

\大括号周围的原因是因为sed默认情况下使用 BRE(基本正则表达式)而不是 ERE(扩展正则表达式),可以使用-Eor-r标志启用。ERE 不受支持,POSIX sed所以基本上答案是通过将它们转义来模拟 BRE 中的 ERE 令牌\

于 2017-06-01T09:16:22.640 回答
2

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

从您提到的问题中,“而是一种从字符串中提取尽可能多的变量的方法”

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

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

PS:如果处理超过 9 个的组,这是一种替代方法可能会非常有用。此外,对于较少的数量,它工作得很好。还有与 , 等变量紧密耦合,awk因此NR格式化更容易。OFSFS

于 2017-06-01T09:23:52.380 回答