GNU Awk 4.2中FS =“”的行为是什么?
十月份的第一周,Arnold Robbins宣布gawk 4.2.0的Beta版现已发布在GNU宣布,bug-gawk和comp.lang.awk邮件列表中。它可在http://www.skeeve.com/gawk/gawk-4.1.65.tar.gz 和他提到这是一个主要版本,具有许多重要的新功能。GNU Awk 4.2中FS =“”的行为是什么?
所以我通过新闻文件去钻研这些功能,并停止在这一点上做一些测试:
变化从4.1.4到4.2.0
...
- POSIX标准中的修订版当FS =“”时,删除POSIX 模式的特例,其中换行符不是字段分隔符。代码 和文档已更新。
如果我理解正确,他谈到GNU Awk User's Guide → 4.5.2 Using Regular Expressions to Separate Fields:
还有就是2案件“FS =“之间的一个重要区别 ” '(一个空格),' FS =“ [\ t \ n] +“'(匹配一个或多个空格,TAB或换行符的正则表达式)。对于FS的两个值,字段由空格,TAB和/或换行符的运行(多个相邻的出现)分隔。但是,当FS的值为“”时,awk会先从记录中删除前导空白和尾随空白,然后确定字段的位置。
也就是使用FS = " "
和FS = "[ \t\n]+"
之间的差异。
我跑新版本,并运行与--posix
模式测试:
$ ./gawk --posix -F" " '{print "NR:", NR; for(i=1;i<=NF;i++) print i, $i}' <<< "hello how are
you"
NR: 1
1 hello
2 how
3 are
NR: 2
1 you
而且我以前的AWK(4.1.3)进行比较,看不出任何区别:
$ gawk --posix -F" " '{print "NR:", NR; for(i=1;i<=NF;i++) print i, $i}' <<< "hello how are
you"
NR: 1
1 hello
2 how
3 are
NR: 2
1 you
总而言之,我的问题是:对于GNU Awk 4.2,FS = " "
在--posix
模式下的行为有什么不同?究竟有什么改变?
1是的,我还以为它应该是4.2.tar.gz
,但http://www.skeeve.com/gawk/gawk-4.2.tar.gz不存在
这是一个beta版本4.2,所以它内置/关闭命名为4.1。当它是官方的时候,它会是4.2.tar.gz.
我没有4.2测试版得心应手测试以下理论,但这里是我想公布关于默认FS=" "
表示:
以前在POSIX当你设置FS=" "
这意味着领域被分离除换行符之外的所有空格字符。另一方面,gawk默认将newline作为分隔符之一,并且必须添加--posix来获得POSIX行为。看:
$ gawk --version
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5, GNU MP 6.1.2)
$ printf 'a b\nc' | awk -v RS='^$' 'NR==1{for (i=1; i<=NF;i++) print NR, NF, i, "<" $i ">"}'
1 3 1 <a>
1 3 2 <b>
1 3 3 <c>
$ printf 'a b\nc' | awk --posix -v RS='^$' 'NR==1{for (i=1; i<=NF;i++) print NR, NF, i, "<" $i ">"}'
1 2 1 <a>
1 2 2 <b
c>
显然现在的POSIX标准已经更新,包括在一组分离字符的\n
时FS=" "
如此笨拙的人不再需要到不同的行为在POSIX与非POSIX模式方面,而是所有的POSIX awks需要更新以表现为gawk一直默认的行为。
您问题中的示例没有测试,因为它使用\n
作为RS(默认值),因此无法测试\n
在记录内发生的情况。设置RS="^$"
后再试一次。
这是好奇......宣布但没有意识到? – RomanPerekhrest