2013-10-15 19 views
5

Ich konnte aus der GNU page of GAWK verstehen, dass es Trennzeichen in Daten mit der FPAT Variable umgehen kann, aber ich kann nicht durch, wie dies funktioniert. Für eine CSV die FPAT Wert Datei ist:awk FPAT Variable: Arbeiten

FPAT = "([^,]+)|(\"[^\"]+\")" 

unter Verwendung der Daten:

abc,"pqr,mno" 

Der erste gruppiert Ausdruck dh alles wertet kein Komma, das dann "abc" als Daten nehmen sollte für die erste scheitern Vorkommen von Komma. Jetzt ist meine Frage, was als nächstes passiert? Wenn der erste gruppierte Ausdruck fehlgeschlagen ist, wird die Regexp mit dem Zeichen oder nach dem Komma fortgesetzt. aber der erste gruppierte Ausdruck ist weiterhin gültig für alle Daten nach dem Komma, so dass es "pqr als nächste Daten benötigen könnte?

Antwort

5

So werden die Feldmuster wie folgt beschrieben.

Eine Zeichenfolge kein Komma, wo der String-Länge größer als Null ist (wird nicht leere Strings entsprechen) enthalten:

[^,]+ 

oder eine Zeichenfolge beginnt und endet mit einem doppelten Anführungszeichen und mindestens ein Zeichen, das keine doppelten Anführungszeichen sind (Flucht Schrägstriche links zur besseren Lesbarkeit out):

 
"[^"]+"  

Regulärer Ausdruck Motor Spiel von Anfang an den strin g und versuche so viele Muster wie möglich zu finden.

abc,"pqr,mno" 

So abc ist längste Zeichenfolge entweder durch Muster aus dem Anfang des Strings angepasst und wird daher $1. Das nächste Zeichen , kann nicht mit einem der beiden Muster verglichen werden, sodass die Engine für reguläre Ausdrücke nur zum nächsten Zeichen " mit Starts wechselt, die mit dem zweiten Muster übereinstimmen. Dies wird bis zum Zeilenende abgeglichen, da "pqr,mno" eine Zeichenfolge ist, die mit doppelten Anführungszeichen beginnt und endet und mindestens ein nicht doppeltes Anführungszeichen enthält. Daher "pqr,mno" werden $2 für den Datensatz abc,"pqr,mno".

+1

Meine Frage ist, warum würde die Regexp mit dem zweiten Muster beginnen bei ", es kann immer für [^,] gehen, da die Daten nicht Komma. Wie regexp ist gierig es wird nur nach dem ersten Spiel suchen, richtig? Oder geht es am längsten? – ghub24

+0

Danke sudo_O, sehr geschätzt. – ghub24

+0

@ user1844303 es wird am längsten gehen. Ein einfacher Test ist es, die Reihenfolge der 2 regulären Ausdrücke zu wechseln. –