awk匹配有"("但没有")"

时间:2016-10-15 09:16:06

标签: awk awk-formatting

我正在用awk编写一个解析器来处理某种严重依赖于括号的文件格式。 为了让我的脚本知道它需要能够以正确的方式解释它们哪个部分

该文件的一部分可能如下所示

        : (MyIntranet
                    :add_routed_domain ()

如果一行包含"("但没有结尾")"这意味着我们已经开始了一个新的部分。 如果一行包含一个开头"("和一个结尾")"这意味着这一行不会启动一个新的部分,它只是包含在"()"

中的数据值的容器

因此,为了让我的awk解析器理解差异,我正在尝试构建一个正则表达式:

如果我们有一行"("该行的任何地方,但该行的最后一个字符不是")"则会开始新的部分。 如果我们有一行以")&#34结尾,则一个部分结束;但是没有"("就行了。

我在这里读到:Regex to ensure a specific word does not occur in the middle of a pattern 你可以使用(?!WORD)与WORD不匹配

我构建了一个看起来像这样的正则表达式:

\(.+(?!\))

我的信念是,这将匹配"("以及之后的任何字符,但如果最后一个字符是&#34则不匹配;)"

我已将这两行放在名为match3.input

的文件中
user@lab-client:~$ awk '/\(.+(?!\))/ { print $0 }' match3.input
user@lab-client:~$

所以显然我做错了,因为我希望上面的命令返回行:

: (MyIntranet

如果我删除(?!))表达式按预期返回两行

user@lab-client:~/bork$ awk '/\(.+/ { print $0 }' match3.input
    : (MyIntranet
                    :add_routed_domain ()

1 个答案:

答案 0 :(得分:0)

awk中的正则表达式为POSIX EREs,其中没有(?...)个扩展名。

在这种情况下,可以使用反转的character class来编写等效表达式:

awk '/\([^(]*$/' match3.input