2016-10-15 74 views
0

我正在寫awk中的一個解析器,以某種特別依賴於括號的文件格式。 對於我的腳本知道它是哪個部分,它需要能夠解釋他們以正確的方式文件的awk匹配具有「(」但不是「)」的行

一部分可能看起來像這樣

 : (MyIntranet 
        :add_routed_domain() 

如果一行包含「(」但沒有結尾「)」,這意味着我們已經開始了一個新的部分。 如果一行同時包含一個開始的「(」和一個結束的「)」,這意味着這行不會開始一個新的部分,它只是一個包含在「()」中的數據值的容器。爲了讓我的awk解析器理解差異,我試圖構造一個正則表達式來執行此操作:

如果我們有一行「(」在行上的任意位置,但行上的最後一個字符是不「)」 的部分,如果我們有「)」結束的行但沒有「(」上線結束

我讀到這裏:Regex to ensure a specific word does not occur in the middle of a pattern 那你CA n使用(WORD?!)不匹配WORD

我構建了一個正則表達式看起來像這樣:

\(.+(?!\)) 

我的信念是,這將匹配「(」和之後的任何字符,但如果最後一個字符是一個「)」

我已經把兩條線在名爲match3.input

[email protected]:~$ awk '/\(.+(?!\))/ { print $0 }' match3.input 
[email protected]:~$ 

所以,很顯然,我做錯了什麼文件我希望上面的命令返回行:(?!)

: (MyIntranet 

如果我刪除)表達式返回兩條線在awk預期

[email protected]:~/bork$ awk '/\(.+/ { print $0 }' match3.input 
    : (MyIntranet 
        :add_routed_domain() 

回答

0

正則表達式POSIX EREs,不具備(?...)擴展。

在這種情況下的倒置character class可用於寫的等效表達式:

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

我想這適用於其他的兩個例子: – Johnathan

+0

我想這適用於其他的兩個例子:匹配線那裏有一個「(」在他們的任何地方,但沒有「)」作爲最後一個字符。/[^(] * \)$ /但我想我錯過了一些東西。 – Johnathan

+0

我的意思是匹配以「)」結尾的一行,但該行應該沒有「(」任何位置前的任何位置 – Johnathan