Awk
awk:錯誤:{} 的帳篷
我使用以下正則表達式查找電子郵件地址:
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 個問題:
- 破折號 (
-
) 表示“字元範圍”而不是明確的破折號。
-
錯誤消息的原因是字元範圍 (_
和) 內的破折號 ( ) 周圍的兩個字元.
不是 (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_.+]+)@
- 點
.
是“匹配除換行符以外的任何字元”的特殊字元。因此,您需要對其進行轉義
\.
或使用“括號表達式”[.]
來顯式匹配點字元,請使用以下命令:^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.
- 最後,“間隔表達式”是對歷史 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})$/'