awk在处理非ascii字符的regex时是非贪婪的吗?

下面两段代码的执行结果让我百思不得其解:

❯ echo This++++this+++is+not++done | awk '{gsub(/\++/," ");}1'
This this is not done

❯ echo "x・・・・・・・・・・・・・・・・x" | awk '{gsub(/・+/,"A");}1'
xAAAAAAAAAAAAAAAAx

可以看到,上面将超出一次出现的+进行了替换,连续的+变成了空格,合理;

但下面的类似命令,则是将每一个单独的替换成了A,而非贪婪地将所有的一连串进行替换。

我思索了很久也只能想到+的不同在于是非ascii字符,不知道是不是这个原因?另外如果需要实现类似的效果,awk命令该怎么写?

因为这个字符是由多个 byte 组成的,假设 是由 byte ABC 组成的,两个 ・・,就是 ABCABC,awk 会看到 /ABC+/ 就只会匹配到 ABC

最简单的解决办法是写成一个 group,这样 awk 看到的就是 /(ABC)+/

1 个赞

原来如此!看来想到是非ASCII字符的方向考虑对了,但是没有进一步再深挖一下背后的原因,还是我自身知识储备有欠缺呀。