Awk

awk:錯誤:{} 的帳篷

  • June 7, 2018

我使用以下正則表達式查找電子郵件地址:

echo "name@server.com" | awk '/^([a-zA-Z0-9_-.\+]+)@([a-zA-Z0-9_-.]+).([a-zA-Z]{2,5})$/ {print $0}'

但它返回錯誤:

awk: cmd. line:1: error : tent of \{\}

短版,使用這個:

$ echo "name@server.com" | 
>    gawk '/^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.([a-zA-Z]{2,5})$/'

假設實際的錯誤消息類似於:

awk: cmd. line:1: error: Invalid range end: …

然後,您的行中有 4 個問題:

  1. 破折號 ( -) 表示“字元範圍”而不是明確的破折號。

-錯誤消息的原因是字元範圍 (_和) 內的破折號 ( ) 周圍的兩個字元.不是 (ASCII) 順序。字元範圍.-_不會引發錯誤。但我確信您的意思不是說“字元範圍”(點.和下劃線之間的所有字元_),而是要匹配明確的破折號(-)。

要匹配“括號表達式”內的顯式破折號,您需要將其設為範圍的第一個或最後一個字元。要麼[-…][…-]。或者,氣餒,逃避它\-。也就是說,這兩個工作:

[-a-zA-Z0-9_.+]
[a-zA-Z0-9_.+-]

但是不,反斜杠不是明確破折號的一般解決方案。嘗試:

$ echo 'ab-cd' | grep -Eo '[a\-c]+'
ab
c

grep 正則表達式(即使擴展:)-E與破折號不匹配。 2. 在“括號表達式”+中並不特殊,因此,它不需要轉義(並且在“括號表達式”中轉義是一個壞習慣)。用這個:

^([-a-zA-Z0-9_.+]+)@
  1. .是“匹配除換行符以外的任何字元”的特殊字元。

因此,您需要對其進行轉義\.或使用“括號表達式”[.]來顯式匹配點字元,請使用以下命令:

^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.
  1. 最後,“間隔表達式”是對歷史 awk 實現的擴展,它可能不適用於所有 awk。這通常“不是問題”,但如果是,您將需要使用:
([a-zA-Z][a-zA-Z][a-zA-Z]?[a-zA-Z]?[a-zA-Z]?)$

但是您可能正在使用 GNU awk,那麼正確的語法應該是:

$ echo "name@server.com" | 
>    gawk '/^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.([a-zA-Z]{2,5})$/'

引用自:https://unix.stackexchange.com/questions/448145