[英]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
{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.