我使用 Unix grep。我想知道如何用它处理命名的捕获组。
目前这是我拥有的:
echo "foobar" | grep -P "(?<q>.)ooba(?<w>.)"
所以理论上,我有 q=f
和 w=r
,但是我不知道如何使用这些变量或通过管道将它们交给下一个命令(例如 awk)。
最后,我想得到如下结果:
f r
上面的字符串只是一个例子。捕获组可以在任何地方,可以是任意数量,打印也可以是任意顺序。我这样说是因为我并不是专门寻找一种方法来提取字符串的最后一个和第一个字符,而是一种从字符串中提取任意数量变量的方法。我知道使用 -o
等技巧, \K
或 (?<=some text).*?(?=some other text)
, 但这些只提取字符串的一部分而不是多个。
最佳答案
sed
中有 9 个捕获组的限制。但是,gawk
不是这种情况。
根据您提到的问题,“而是一种从字符串中提取尽可能多的变量的方法”。
sed
如果您必须与 1-9 组一起玩,则最适合这项工作。如果不是这种情况,gawk
的match
功能也很有帮助。 (使用与 Inian 相同的正则表达式)
echo "foobar" | awk '{match($0,/^(.)(.+)(.)$/,a);print a[1],a[3]}'
f r
PS:如果处理的组超过 9 个,这是另一种方法可能非常有用。此外,对于较少的组,它工作得很好。还有一些与 awk
的变量紧密耦合,如 NR
、OFS
、FS
,因此格式化更容易。
关于regex - 使用 grep 命名捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44303134/