Regex Awk是否支持正则表达式量词\{m,n\}或\{m\}或\{m,\}?

Regex Awk是否支持正则表达式量词\{m,n\}或\{m\}或\{m,\}?,regex,awk,Regex,Awk,我正在寻找打印文件中的所有列,可以包含一个10位数的手机号码 我试过这个: awk '/[0-9]\{10\}/{for(i=1;i<=NF;++i)if($i~/[0-9]\{10\}/)print $i}' filename 是的,在GNU awk中是这样的!只是你不必逃避它们: $ awk 'BEGIN{v=10; if (v~/10{2}/) print "yes"}' $ awk 'BEGIN{v=100; if (v~/10{2}/) print &qu

我正在寻找打印文件中的所有列,可以包含一个10位数的手机号码

我试过这个:

awk '/[0-9]\{10\}/{for(i=1;i<=NF;++i)if($i~/[0-9]\{10\}/)print $i}' filename

是的,在GNU awk中是这样的!只是你不必逃避它们:

$ awk 'BEGIN{v=10; if (v~/10{2}/) print "yes"}'

$ awk 'BEGIN{v=100; if (v~/10{2}/) print "yes"}'
yes
因此,正则表达式应该如下所示:

/[0-9]{10}/
根据您的示例输入,它将产生以下结果:

$ awk '/[0-9]{10}/ {for (i=1;i<=NF;i++) if ($i ~ /[0-9]{10}/) print $i}' n
9898664511
7788992121
7665544213
9090876534\n
发件人:

{n}

{n,}

{n,m}

大括号内的一个或两个数字表示区间表达式。如果大括号中有一个数字,则前面的regexp将重复n次。如果有两个数字以逗号分隔,则前面的regexp将重复n到m次。如果有一个数字后跟逗号,则前面的regexp将至少重复n次:

wh{3}y
匹配“whhhy”,但不匹配“why”或“whhhy”

wh{3,5}y
仅匹配“whhhy”、“whhhy”或“whhhhy”

wh{2,}y
匹配“whhy”、“whhy”等

区间表达式在awk中传统上不可用。它们被添加为POSIX标准的一部分,以使awk和egrep相互一致。

最初,因为旧程序可能在regexp常量中使用“{”和“}”,所以gawk与regexp中的区间表达式不匹配

但是,从版本4.0开始,gawk默认情况下会匹配区间表达式。这是因为对于大多数gawk用户来说,与POSIX的兼容性比与旧程序的兼容性更为重要

对于在regexp常量中使用“{”和“}”的程序,最好总是使用反斜杠对其进行转义。然后,regexp常量是有效的,并且使用任何版本的awk.16按照您希望的方式工作

最后,当“{”和“}”以不能解释为区间表达式的方式出现在regexp常量中(例如/q{a}/)时,它们代表它们自己


我只想在你的控制台中使用awkType
awk--version
,把输出放在你的问题中。谁投票关闭了
通用计算硬件和软件
lol?我试过awk'/[0-9]{10}/{for(I=1;你在GNU awk吗?另外,请在你的问题中提供一个答案。编辑它以反映这一点。我试过这个awk'/[0-9]{10}/{for(i=1;iyes我使用了/usr/xpg4/bin/awk,这是预期的效果,thanksRE间隔不是特定于
gawk
,它们是ERE中的POSIX。任何POSIX
awk
都将支持它们。
sed
需要转义它们的原因是sed默认支持BRE,而不是ERE,因此您需要转义ERE元字符以将其激活为例如在
sed
脚本中。GNU awk的旧版本在默认情况下不支持它们与旧的awk脚本向后兼容(其中
/a{2}/
字面意思是
“a{2}”
不是
“aa”
),但随着POSIX的发展,
gawk
。其他旧的awk(例如名称非常糟糕的“New awk”、
nawk
)不兼容POSIX,不支持它们。
wh{3,5}y
wh{2,}y