【问题标题】:Named capture groups with grep使用 grep 命名的捕获组
【发布时间】:2017-06-01 09:06:45
【问题描述】:

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

目前这是我所拥有的:

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

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

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

f r

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

【问题讨论】:

标签: regex grep capture-group


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    RegEx Demo

    \ 在大括号周围的原因是因为sed 默认使用 BRE(基本正则表达式)和 ERE(扩展正则表达式)可以使用 -E 或 @ 启用987654330@ 标志。 POSIXsed 不支持 ERE,所以基本上答案是通过使用 \ 转义来自 BRE 的 ERE 令牌来模拟它们

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 2012-01-26
      • 2014-06-26
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 2020-11-04
      • 2023-04-03
      相关资源
      最近更新 更多