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