regex - 使用 grep 命名捕获组

标签 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) , 但这些只提取字符串的一部分而不是多个。

最佳答案

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

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

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

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

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

关于regex - 使用 grep 命名捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44303134/

相关文章:

javascript - 为什么我的正则表达式捕获组在匹配多个部分时只捕获字符串的最后一部分?

java - 将 Java 正则表达式捕获组替换为其自身的一部分

linux - FreeBSD 上的 GNU grep 无法正常工作

linux - 如何在目录中的文件上运行命令递归地在每个被访问的目录中创建一个新文件(Bash)?

linux - Grep-ing 同时保持第一行

python : Convert Integers into a Count (i. e。 3 --> 1,2,3)

python - 有没有一种优雅的方法来查看整个字符串是否只包含匹配项?

regex - 用grep检测俄语字符

java - 为什么 Pattern.compile 在 android studio 和 Java SE 中的行为不同?

regex - Elasticsearch -正则表达式以匹配字符串/数字作为子字符串