我熟悉指定有界正则表达式量词的概念,如下所示:
Quantifier Legend Example Sample Match
{3} Exactly three times \D{3} ABC
{2,4} Two to four times \d{2,4} 156
{3,} Three or more times \w{3,} regex_tutorialer
mawk
但是,我在手册页和网上都找不到类似上述的内容。
该mawk
命令是否具有此功能,或者是否有其他方法可以实现相同的效果?
我正在使用版本1.3.3
答案1
符合 POSIX 标准的实现支持间隔正则表达式运算符awk
。
但由于awk
最初不支持它们(nawk、mawk 和 gawk 都不支持),仍然有几个实现不支持它们,例如mawk
, 这一个真正的 awkk
(最初由 Brian Kernighan 维护awk
)直到几天之前、 Solaris /bin/awk
、 Solaris /bin/nawk
、awk
大多数 BSD 中的一种。
与 一样egrep
,一些实现反对添加对它们的支持,因为它们会破坏向后兼容性(在 BRE 中不存在\{x,y\}
与 所使用的类似问题grep
)。
\w
、\d
、\D
是通常不支持的 perl 正则表达式扩展(busyboxawk
和gawk
(不在 POSIX 模式下时)支持\w
)。标准等效项分别是[[:alnum:]_]
、[[:digit:]]
,[^[:digit:]]
但尚不支持mawk
。
在 Solaris 上,您需要使用/usr/xpg4/bin/awk
.
对于旧版本的 GNU awk
,您必须使用该选项,或者在支持正则表达式间隔的环境中--re-interval
启动它。POSIXLY_CORRECT=anything
对于不支持它们的实现,您可以使用?
,+
和的组合*
:
x{1,3}
->xx?x?
或(x|xx|xxx)
x{1,}
->x+
x{0,}
->x*
x{3,}
->xxx+
或xxxx*
x{3,6}
->xxxx?x?x?
- ETC。
无论如何,mawk
不支持本地化或多字节字符,因此您不妨限制为 ASCII 字符并使用[_a-zA-Z]
,[0-9]
和[^0-9]