awk: 错误: \{\} 的帐篷

awk: 错误: \{\} 的帐篷

我使用以下正则表达式来查找电子邮件地址:

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

但它返回错误:

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

答案1

简短版本,使用这个:

$ echo "[email protected]" | 
>    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_.+]+)@
    
  3. .是一个特殊字符,“匹配除换行符之外的任何字符”。
    因此,您需要转义它\.或使用“括号表达式”[.]来显式匹配点字符,请使用:

    ^([-a-zA-Z0-9_.+]+)@([-a-zA-Z0-9_.]+)\.
    
  4. 最后,“区间表达式”是对历史 awk 实现的扩展,它可能不适用于所有 awk。这通常“不是问题”,但如果是,您将需要使用:

    ([a-zA-Z][a-zA-Z][a-zA-Z]?[a-zA-Z]?[a-zA-Z]?)$
    

但您可能使用的是 GNU awk,正确的语法应该是:

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

答案2

回答:

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

解释: 该字符-在放置位置上是不明确的,因为它可能代表一个区间。将其移至正则表达式的开头或转义它都可以正常工作。

更多信息: 检查你的正则表达式是否有用网站有疑问时。


正如正确指出的艾萨克,表达式中的最后一个点并不像您想象的那样:.代表任何字符,如果您希望它表示文字点,则应该转义它\.

进一步的优化包括不转义括号内的字符,因为这是不必要的。我指的\+是第一个字符集,我必须感谢艾萨克再次发现这个!

我无法理解的另一件事是为什么你会使用所有这些圆括号()

除了纠正使用-和建议一些小的改进之外,这里的基本主题是广泛讨论的使用正则表达式来验证电子邮件地址的机会。正确匹配任何电子邮件地址是一项艰巨的任务,需要比人们最初想象的复杂得多的表达式。在此论坛和类似论坛上经常发现的合理做法是使用预计适用于您的数据集的最简单的正则表达式。

答案3

连字符-是字符类中的特殊字符 (括号表达式) 指定字符范围。如果您想将文字添加-到字符类中,您需要对其进行转义或将其移动到^字符类的末尾或开头(在 后面,如果有的话)。

[a-z-]
[-a-z]
[a-z\-A-Z]

7.[...]

^如果 < 连字符减号 > 字符出现在列表中的第一个(在首字母后,如果有的话)或最后一个,或者作为范围表达式中的结束范围点,则应将其视为自身。例如,表达式 [-ac][ac-]是等效的并且匹配任意字符“a”、“c”或“-”;[^-ac][^ac-]是等价的并且匹配除 'a'、'c' 或 '-' 之外的任何字符; [...]

如果括号表达式同时指定“-”和“]”,则在括号表达式中,“]”应放在第一位(在“^”之后,如果有),“-”放在最后。

答案4

您使用的是哪个版本awk

当我使用 GNU 时,此命令不会出错awk,尽管它不产生任何输出。

使用solaris awk它会产生此错误:

awk: syntax error near line 1
awk: bailing out near line 1

仔细阅读您的regex,它永远不会匹配电子邮件地址......

相关内容