簡體   English   中英

awk reg表達式模式匹配不起作用

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

看到不同? 您可以在一個動作塊中放置一個條件,但隨后需要用適當的控制關鍵字將其括起來,例如ifwhile這樣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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM