awk支持正则表达式量词 {m,n }或 {m }或 {m,}



我想打印一个可以包含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 9090876534n

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

因此,使用开始^和行末端$字符的结尾可能是一个好主意,将这些字段匹配恰好 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}

括号内的一个或两个数字表示间隔表达式。如果牙套中有一个数字,则重复前面的regexp n次。如果有两个数字被逗号隔开,则将前面的REGEXP重复为N到M次。如果有一个数字后面是逗号,则至少n次重复前面的regexp:

wh{3}y

匹配" whhy",但不匹配"为什么"或" whhhy"。

wh{3,5}y

仅匹配" whhy"," whhhy"或" whhhhy"。

wh{2,}y

匹配" hhy"," whhy"等等。

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

最初,因为旧程序可以在Regexp常数中使用" {"one_answers"}",所以Gawk与Regexps中的间隔表达式不匹配。

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

对于在Regexp常数中使用" {"one_answers"}"的程序,最好始终以后斜切逃脱它们。然后,Regexp常数是有效的,并使用任何版本的awk.16

按照您想要的方式工作。

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

最新更新