我想处理这个清单:(当然这只是一个摘录。)
1 S3 -> PC-8-Set
2 S3 -> PC-850-Set
3 S3 -> ANSI-Set
4 S3 -> 7-Bit-NRC
5 PC-8-Set -> S3
6 PC-850-Set -> S3
7 ANSI-Set -> S3
这就是我所做的:
awk -F '[[:blank:]]+' '{printf ("%s ", $2)}' list
这就是我得到的:
1 2 3 4 5 6 7
现在我认为量词+
相当于{1,}
,但当我将行更改为
awk -F '[[:blank:]]{1,}' '{printf ("%s ", $2)}' list
我只是空白,整条线读到了1美元。
有人能解释一下这种行为吗?我很感谢每一个答案!
答案 0 :(得分:6)
尝试
awk --re-interval -F '[[:blank:]]{1,}' '{printf ("%s ", $2)}' list
--re-interval
在regexp中允许间隔表达式(请参阅Regexp Operators)。现在这是gawk的默认行为。不过,这个 选项仍然是为了向后兼容,以及用于 与
--traditional
选项组合。
答案 1 :(得分:4)
您使用的是Gawk,它是在2010年11月提交之前发现的,由git bisect
找到。
http://git.savannah.gnu.org/cgit/gawk.git/commit/?id=40b3741f63c19e38077d57f4ce4737916ec5073e
这种变化确实取决于间隔的默认行为,默认情况下会变为开启(正如POSIX要求的那样)。
看起来--re-interval
选项只会降级为--traditional
;即,如果启用了--traditional
,那么{m,n}
的支持就会消失,但可以选择性地带回--re-interval
。
在您的版本中,默认情况下无法识别{m,n}
,无论是否有--traditional
。在此提交之前都是如此:
commit 00ef0423acd97cb964a2bae54c93a03a8ab50e5e
Author: Arnold D. Robbins <arnold@******>
Date: Fri Jul 16 14:55:10 2010 +0300
Move to 3.1.8.
然后你仍然落后于3.1.5。