与awk一起使用的正则表达式中的量词表示意外

时间:2013-12-05 07:17:56

标签: regex bash awk gawk

我想处理这个清单:(当然这只是一个摘录。)

    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美元。

有人能解释一下这种行为吗?我很感谢每一个答案!

enter image description here

2 个答案:

答案 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。