繁体   English   中英

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

[英]Does Awk support regular expression quantifiers \{m,n\} or \{m\} or \{m,\}?

我想将文件中的所有列打印为可以包含10位手机号码的文件

我尝试了这个:

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

但这是行不通的。

我只想用Awk做

例如文件中的文字

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

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

《 GNU Awk用户指南》→3.3正则表达式运算符

{N}

{N,}

{N,M}

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

 wh{3}y 

匹配“为什么”,但不匹配“为什么”或“为什么”。

 wh{3,5}y 

仅匹配“ whhhy”,“ whhhhy”或“ whhhhhy”。

 wh{2,}y 

匹配“为什么”,“为什么”,依此类推。

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

最初,由于旧程序可能在正则表达式常量中使用“ {”和“}”,因此gawk与正则表达式中的间隔表达式不匹配。

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

对于在正则表达式常量中使用'{'和'}'的程序,最好始终使用反斜杠对其进行转义。 然后,使用任何版本的awk.16,regexp常量均有效并按照您希望的方式工作。

最后,当“ {”和“}”以无法解释为间隔表达式的方式(例如/ q {a} /)出现在正则表达式常量中时,则它们代表自己。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM