2016-10-15 4 views
0

Ich schreibe einen Parser in awk zu einem bestimmten Dateiformat, das stark auf Klammern beruht. Für meinen Skript zu wissen, in welchem ​​Bereich es ist, es muss in der Lage sein, sie in der richtigen Art und Weise könnteawk match Linien, die ein "(" aber nein ")

Ein Teil der Datei wie diese

 : (MyIntranet 
        :add_routed_domain() 

aussehen zu interpretieren Wenn eine Zeile enthält eine „(“ aber kein Ende ")" das heißt, wir haben einen neuen Abschnitt begonnen. Wenn eine Zeile sowohl einen Anfang "(" und "eine Endung") enthält, bedeutet dies, dass diese Zeile keinen neuen Abschnitt beginnt, sondern nur ein Container für einen Datenwert, der innerhalb des "()"

enthalten ist Reihenfolge für meine awk-Parser zu verstehen, den Unterschied Ich versuche, eine Regexp dies zu tun:

Ein neuer Abschnitt beginnt, wenn wir eine Zeile mit einem "(" irgendwo auf der Linie, aber das letzte Zeichen auf der Linie ist nicht „)“ ein Abschnitt endet, wenn wir eine Linie, die mit „)“, aber es gab keine „(“ auf der Linie

ich lese hier haben. Regex to ensure a specific word does not occur in the middle of a pattern , dass cA Sie n verwenden (WORD?!) nicht WORD passen

ich einen regulären Ausdruck konstruiert, die wie folgt aussieht:

\(.+(?!\)) 

Ich glaube, dass dies würde passen a „(“ und alle Zeichen nach, aber nicht, wenn das letzte Zeichen ist ein „)“

ich die beiden Zeilen in einer Datei match3.input

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

so offensichtlich ich etwas tue, falsch, wie ich erwarten würde den obigen Befehl zur Rückkehr aufgerufen gesetzt haben die Zeile: (?!)

: (MyIntranet 

Wenn ich entferne die) der Ausdruck beiden Linien wie erwartet zurück

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

Antwort

0

Reguläre Ausdrücke in awkPOSIX EREs sind, die die (?...) Erweiterungen nicht haben.

In diesem Fall wird eine umgekehrtes character class kann einen äquivalenten Ausdruck schreiben verwendet werden:

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

ich dies zwei weitere Beispiele anzuwenden versuchen: – Johnathan

+0

Ich versuche, dies zu zwei weiteren Beispielen anzuwenden: passende Linien das hat ein "(" irgendwo in ihnen, aber kein ") als letztes Zeichen./[^ (] * \) $/Aber ich denke, ich vermisse etwas. – Johnathan

+0

Ich meine, match eine Zeile endet mit einem ")", aber die Zeile sollte keine "(" irgendwo davor haben. – Johnathan

Verwandte Themen