Regex 与awk一起使用的正则表达式中的量词的行为异常

Regex 与awk一起使用的正则表达式中的量词的行为异常,regex,bash,awk,gawk,Regex,Bash,Awk,Gawk,我想处理这个列表:(当然这只是一个摘录。) 这就是我所做的: awk-F'[:blank:][]+'{printf(“%s”,$2)}'列表 这就是我得到的: 1234567 现在我认为量词+相当于{1,},但是当我将行更改为 awk-F'[:blank:]{1,}'{printf(“%s”,$2)}'列表 我得到的只是空白,整行读到1美元 有人能解释一下这种行为吗?我感谢每一个答案 试试看 --重新间隔 允许在Regexp中使用间隔表达式(请参见Regexp运算符)。这现在是gawk的默认行为

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

这就是我所做的:

awk-F'[:blank:][]+'{printf(“%s”,$2)}'列表

这就是我得到的:

1234567

现在我认为量词
+
相当于
{1,}
,但是当我将行更改为

awk-F'[:blank:]{1,}'{printf(“%s”,$2)}'列表

我得到的只是空白,整行读到1美元

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

试试看

--重新间隔

允许在Regexp中使用间隔表达式(请参见Regexp运算符)。这现在是gawk的默认行为。然而,这 该选项保留为向后兼容,并在中使用 与
--传统的
选项组合使用


您使用的是2010年11月提交之前的一个Gawk,由
git bisect
找到

这一变化实际上取决于间隔的默认行为,默认情况下,间隔变为启用状态(POSIX要求)

看起来,
--re interval
选项被降级,仅用于
--traditional
;i、 e.如果启用了
--traditional
,则对
{m,n}
的支持将消失,但可以通过
--re interval
有选择地恢复

在您的版本中,
{m,n}
在默认情况下无法识别,无论是否带有
--传统的
。这在本次提交之前是正确的:

commit 00ef0423acd97cb964a2bae54c93a03a8ab50e5e
Author: Arnold D. Robbins <arnold@******>
Date:   Fri Jul 16 14:55:10 2010 +0300

    Move to 3.1.8.
commit 00ef0423acd97cb964a2bae54c93a03a8ab50e5e
作者:阿诺德·D·罗宾斯
日期:星期五2010年7月16日14:55:10+0300
移至3.1.8。

在3.1.5版本中,您仍然落后于此。

我看这两个命令都没有区别。你在使用GNU awk吗?也许你需要摆脱大括号?我试过了。我刚收到这些警告:
gawk:warning:escape sequence
\{'被当作普通的
{'
我认为唯一的解释是一个旧版本。简单的旧awk对Mac上的两个调用都很好。你有什么版本的gawk?
--posix
也可以工作。
gnu awk
在默认情况下不适用于
区间表达式
你需要告诉它这样做。很好,它可以工作。我没有看到它的使用f
interval expression
前面的
字段分隔符中的
区间表达式。。如果它是gawk的默认行为,为什么需要显式指定它。Bugaboo。它的
gawk的
默认行为为
使用
区间表达式
,所以你需要告诉它使用它。@Jotne得到了它。关键是命令是在使用旧的awk,但是文档是针对新的行为的。谢谢你的回复。我必须承认,我不完全理解你在这里写的所有内容。我唯一想补充的是,我不是上述系统的管理员,所以我不能更新gawk。@Nil-o-mat这一切意味着awk语言已经改变。曾经是一个p在Unix系统上运行的程序。随着Unix的发展,它多年来发生了变化,并被POSIX标准化。这造成了一些旧的awk程序需要某些旧的行为,或者它们会中断。例如,一些程序可能依赖于
{
字符在正则表达式中不特殊。POSIX说所有awk正则表达式都是扩展正则表达式(ERE),其中
{
是活的。所以GNU Awk试图通过组合默认值和选项来满足这两个需求。嗯,这是有道理的。所以基本上这是一个遗留问题…谢谢,给了我一些背景。总是很想知道。
awk --re-interval -F '[[:blank:]]{1,}' '{printf ("%s ", $2)}' list
commit 00ef0423acd97cb964a2bae54c93a03a8ab50e5e
Author: Arnold D. Robbins <arnold@******>
Date:   Fri Jul 16 14:55:10 2010 +0300

    Move to 3.1.8.