regex 使用grep命名捕获组

wkyowqbh  于 2023-05-13  发布在  其他
关注(0)|答案(2)|浏览(158)

我使用Unix grep。我想知道如何用它来处理命名的捕获组。
这是我目前拥有的:
echo "foobar" | grep -P "(?<q>.)ooba(?<w>.)"
所以理论上,我有q=fw=r,但是我不知道如何使用这些变量,或者通过管道将它们交给下一个命令(例如awk)。
最后,我希望得到以下结果:
f r
上面的字符串只是一个例子。捕获组可以在任何地方,可以是任何数量,并且打印也可以是任何顺序。我这么说是因为我并不是专门在寻找一种方法来提取字符串的最后一个和第一个字符,而是一种方法来从字符串中提取我想要的变量。我知道一些技巧,比如使用-o\K(?<=some text).*?(?=some other text),但这些只提取字符串的一部分,而不是多个。

jgzswidk

jgzswidk1#

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,所以格式化更容易。

dgiusagp

dgiusagp2#

grep无法使用 named 捕获的组进行打印。对于给定的示例,使用带有 * 常规 * 捕获组(未命名)的sed

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

字面意思是匹配第一个字符-字符串的其余部分和最后一个字符。现在您可以从\1访问各个捕获的组。\n符号,
RegEx Demo
大括号周围的\的原因是因为sed默认使用BRE(基本RegEx)和 not ERE(扩展RegEx),可以使用-E-r标志启用。POSIXsed中不支持ERE,因此答案基本上是通过使用\转义BRE来模拟ERE令牌

相关问题