[英]awk reg expression pattern matching doesn't work
我試圖使用[:digit:]
來匹配行中的數字,這是代碼。
~ echo -e "abc\n123\ndef" | awk '{/[[:digit:]]/{print $0}}'
awk: syntax error at source line 1
context is
>>> {/[[:digit:]]/{ <<<
awk: illegal statement at source line 1
awk: illegal statement at source line 1
我的問題是:
1,為什么用[[:digit:]]
代替[:digit:]
。
2,為什么此代碼段無法運行? 怎么修改呢?
您不得將花樣放在花括號內。
awk '/[[:digit:]]/{print $0}'
語法是
awk 'condition{execute if the condition is true}'
在某些情況下,僅滿足條件就足夠了。 對於這種情況,下面就足夠了,
awk '/[[:digit:]]/'
例:
$ echo -e "abc\n123\ndef" | awk '/[[:digit:]]/'
123
為什么使用
[[:digit:]]
而不是[:digit:]
?
POSIX括起來的表達式[:digit:]
僅與數字字符不匹配,您必須將其放在[[:digit:]]
類的字符類中。
如果要匹配數字以及+
符號,則可以修改上述POSIX類,例如
[+[:digit:]]
AWK語法為:
<condition> { <action> }
如果當前記錄的<condition>
為true,則執行<action>
。 您寫的是:
{ <condition> { <action> } }
看到不同? 您可以在一個動作塊中放置一個條件,但隨后需要用適當的控制關鍵字將其括起來,例如if
或while
這樣awk就會知道您想對該條件做什么:
{ if (<condition>) { <action> } }
{ while (<condition>) { <action> } }
因此,代替:
{/[[:digit:]]/{print $0}}
要在語法上和習慣上正確,您應該寫:
/[[:digit:]]/{print $0}
但是由於打印$ 0是默認操作,所以您真正要寫的是:
/[[:digit:]]/
即:
$ echo -e "abc\n123\ndef" | awk '/[[:digit:]]/'
123
至於為什么[[:digit:]]
而不是[:digit:]
:
[:digit:]
是POSIX字符類,因此可以在方括號表達式內用作正則表達式的一部分,例如[[:digit:]]
,就像范圍表達式( 0-9
)或字符列表( 0123456789
)也可以在方括號表達式內使用,以達到相同的效果。
該示例可能有助於闡明: [:digit:]
是字符類, [:punct:]
也是如此,因此[[:digit:][:punct:] \\t]
是包含2個字符類和一個字符的方括號表達式列表( \\t
)。
從POSIX( http://pubs.opengroup.org/onlinepubs/9699919799/toc.htm ):
字符類表達式表示為括在方括號(“ [:”和“:]”)分隔符內的字符類名稱。
和
方括號表達式(用方括號括起來的表達式“ []”)...是匹配列表表達式或不匹配列表表達式。 它由一個或多個表達式組成:...,字符類,.....
因此,字符類為[:<name>:]
,括號表達式為[<expression>]
,其中<expression>
可以是/包含字符類: [[:<name>:]]
。
PS警告:有一個通常引用的網站http://www.regular-expressions.info/posixbrackets.html ,其中的字符類和括號表達式術語完全錯誤。 也許更公平地說,他們使用的術語充其量是含糊的,因為它們將POSIX括號表達式稱為“字符類”,但隨后又將POSIX字符類稱為“字符類”。 但是,您要對其進行特征化,因為他們在自己的網站上聲明自己,所以它們的術語肯定不同於POSIX用於括號表達式和字符類的術語。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.