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

时间:2016-12-02 14:41:19

标签: regex awk

我希望打印一个包含10位移动电话号码的文件中的所有列

我试过了:

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

但这个sems无效。

我只想使用Awk

例如文件中的文字

named 9898664511 nameb \n
namea nameb namec 7788992121 \n
namec named 7665544213 named \n
namea namec namef nameg namek 9090876534\n

1 个答案:

答案 0 :(得分:2)

是的,它在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

因此,最好使用开头^和行尾$字符来匹配完全 10个数字中包含的字段:

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

来自The GNU Awk User’s Guide → 3.3 Regular Expression Operators

  

<强> {N}

     

<强> {N,}

     

<强> {N,M}

     

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

wh{3}y
     

匹配'whhhy',但不是'why'或'whhhhy'。

wh{3,5}y
     

仅匹配'whhhy','whhhhy'或'whhhhy'。

wh{2,}y
     

匹配'whhy','whhhy'等等。

     

传统上awk中没有区间表达式。它们作为POSIX标准的一部分添加,使awk和egrep相互一致。

     

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

     

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

     

对于在regexp常量中使用“{”和“}”的程序,最好始终使用反斜杠转义它们。然后regexp常量是有效的,并且使用任何版本的awk.16以你想要的方式工作。

     

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