使用 grep 命名捕获组

Named capture groups with grep

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

目前我拥有的是:

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

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

最后,我想得到以下结果:

f r

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

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

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

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

RegEx Demo

大括号周围 \ 的原因是因为 sed 默认使用 BRE (Basic RegEx) 而 not ERE (Extended RegEx) 可以使用 -E-r 标志启用。 POSIX sed 不支持 ERE,所以基本上答案是通过使用 \

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

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

根据您提到的问题,"but rather an approach to extract as many variables as I want from a string"

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

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

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