如果字段分隔符为空字符串,则每个字符都成为一个单独的字段。
然而,如果FS是一个可能匹配零次的正则表达式,则不会发生相同的行为:
有人知道为什么吗?我在gawk手册中找不到任何内容。这是
我最感兴趣的是为什么第二种情况没有将记录分成更多字段。就好像awk将
$ echo hello | awk -F '' -v OFS=, '{$1 = NF OFS $1} 1'
5,h,e,l,l,o
然而,如果FS是一个可能匹配零次的正则表达式,则不会发生相同的行为:
$ echo hello | awk -F ' *' -v OFS=, '{$1 = NF OFS $1} 1'
1,hello
有人知道为什么吗?我在gawk手册中找不到任何内容。这是
FS=""
的特例吗?我最感兴趣的是为什么第二种情况没有将记录分成更多字段。就好像awk将
FS=" *"
视为FS="+"
一样。
1,hello
,并显示警告awk:字段分隔符FS为空
。正如其他答案所提到的,这是未定义的行为。还要注意,*
不是正则表达式——它只是字符*
。要使用正则表达式,您需要像.*
这样的东西——您将获得“所有内容”。 - Florissplit()
和match()
函数进行了一些测试,结果相同。所以我猜我们必须阅读awk的正则表达式匹配代码,才能理解如果匹配start=0,length=0
,gawk如何处理结果。很可能(我还没有阅读代码)awk认为它不匹配,因此整个字符串/行将作为字段。<space>*
是正则表达式,在你的问题中,实际上与:echo hello|awk -F 'm*' ...
相同。无论如何,这是一个有趣的问题。 - Kent