我正在用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 ()
答案 0 :(得分:0)
awk
中的正则表达式为POSIX EREs,其中没有(?...)
个扩展名。
在这种情况下,可以使用反转的character class来编写等效表达式:
awk '/\([^(]*$/' match3.input