不匹配时的awk regexp

不匹配时的awk regexp,awk,Awk,在此之前,我得到了一些帮助来构造一个regexp,它可以匹配以“:“然后是anything,然后是a”(“之后是anything,但不能以a结尾”)开头的任何行 我使用的regexp是: /:.+ \(.[^)]*$/ 它似乎运行得相当好。我有以下输入行: :web_application_settings ( :isakmp.phase1_DH_groups ( :ike_p1 ( :ike_p1_dh_grp (ReferenceObject :isakmpkeymanager (lala

在此之前,我得到了一些帮助来构造一个regexp,它可以匹配以“:“然后是anything,然后是a”(“之后是anything,但不能以a结尾”)开头的任何行

我使用的regexp是:

/:.+ \(.[^)]*$/
它似乎运行得相当好。我有以下输入行:

:web_application_settings (
:isakmp.phase1_DH_groups (
:ike_p1 (
:ike_p1_dh_grp (ReferenceObject
:isakmpkeymanager (lalalal)
并且输出仅为::ike_p1_dh_grp(ReferenceObject

但后来我碰巧加了一句话:

:isakmpkeymanager ()
这不应该匹配,但它确实匹配,这我觉得很奇怪。当我使用“不匹配:[^)]后接“开始”以允许它不匹配,然后是“结束”时,我在regexp中错过了什么,使以“)”结尾的行仍然匹配。

尝试:

awk '/:.+ \([^)]+$/' File
出了什么问题 让我们看一下原始正则表达式,
/:.+\(.[^)]*$/
,一步一步:

  • 表示单个冒号

  • +
    表示任何字符中的一个或多个。(
    +
    表示一个或多个。)

  • 表示一个空白

  • \(
    表示一个打开的参数

  • 表示任意字符之一

  • [^)]*
    表示除结束符以外的任何字符的零个或多个。(
    *
    表示零或更多。)

  • $
    表示行尾


  • 问题出在步骤5,它可以匹配
    。在修订后的正则表达式中,这一点被消除,并将
    [^]*
    替换为
    [^]+
    \(
    允许任何单个任意字符-包括
    -紧跟在括号后面。如果那不是你想说的,就把它拿出来