awk gensub得到了错误的匹配部分

时间:2018-01-04 10:39:55

标签: regex bash awk

我想提取" yy a1 b1"用awk表达式

echo "xx yy [a1 b1] / zz [a2 b2]/" | awk '{p=gensub(/.*\[([a-z0-9 ]+)\].*/,"\\1",1); print $2,p}'

但总是得到" yy a2 b2"。我可能会找到一个解决方案,但只是好奇上面的表达问题。 prototype of gensub是:

gensub(regexp, replacement, how [, target])

为什么指定'如何'没有生效?

2 个答案:

答案 0 :(得分:1)

关键是第一个.*尽可能多的字符,从而使正则表达式引擎匹配剩余子图案的最后一次出现。

您可以使用以下解决方案:

/[^][]*\[([a-z0-9 ]+)\].*/

其中[^][]*匹配除][以外的任何0个或多个字符,因此,允许正则表达式引擎在第一个[...]之前停止

请参阅online demo

答案 1 :(得分:0)

关注awk也可以帮助您。

echo "xx yy [a1 b1] / zz [a2 b2]/".  | awk -F'[] []' '{print $2,$4,$5}'

输出如下。

yy a1 b1