簡體   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