2013-10-15 17 views
5

Sono stato in grado di comprendere dallo GNU page of GAWK che può gestire i delimitatori nei dati utilizzando la variabile FPAT ma non riesco a vedere come funziona. Per un file CSV il valore FPAT è:awk Variabile FPAT: funzionante

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

Utilizzando i dati:

abc,"pqr,mno" 

La prima espressione raggruppati restituisce tutto quello che cioè non una virgola, questo dovrebbe prendere "abc" come dati quindi non riescono per la prima occorrenza della virgola. Ora la mia domanda è cosa accadrà dopo? Poiché la prima espressione raggruppata non è riuscita, l'espressione regolare continua dal carattere dopo la virgola utilizzando la condizione o? ma la prima espressione raggruppata continua ad essere valida per tutti i dati dopo la virgola, quindi potrebbe richiedere "pqr come dati successivi?

risposta

5

Quindi i modelli di campo sono descritti come segue.

Una stringa non contiene una virgola in cui la lunghezza della stringa è maggiore di zero (non corrisponderà stringhe vuote):

[^,]+ 

O una stringa che inizia e termina con virgolette e contenente almeno un carattere che non è una doppia citazione (backslash fuga lasciato fuori per migliorare la leggibilità):

 
"[^"]+"  

regolare partita motore delle espressioni dall'inizio della strIn g e cerca di abbinare il più possibile dato i modelli.

abc,"pqr,mno" 

Così abc è più lunga stringa corrispondente o modello fin dall'inizio della stringa e quindi diventa $1. Il prossimo carattere , non può essere abbinato da nessuno dei due pattern in modo che il motore di espressioni regolari si sposti sul prossimo carattere " con gli avviamenti corrispondenti al secondo modello. Questo è abbinato fino alla fine della riga come "pqr,mno" è una stringa che inizia e finisce con virgolette doppie e contiene almeno un carattere non doppia virgoletta. Pertanto, "pqr,mno" diventa $2 per il record abc,"pqr,mno".

+1

La mia domanda è: perché l'espressione regolare inizia con il secondo modello in ", può sempre andare per [^,] perché i dati non sono virgola. Poiché regexp è avido, cercherà solo la prima corrispondenza, vero? va avanti per il più lungo? – ghub24

+0

Grazie sudo_O, molto apprezzato – ghub24

+0

@ user1844303 andrà per il più lungo. Un test facile è quello di cambiare l'ordine delle 2 espressioni regolari. –