2012-04-20 24 views
7

Spesso mi trovo a fare la stessa partita nell'azione del pattern, per accedere ad alcune parti del record di input, ad es.un modo per accedere ai gruppi abbinati in azione?

/^Compiled from \"(.*)\"$/ { 
    file_name = gensub("^Compiled from \"(.*)\"$", "\\1", "g"); 
    print file_name; 
} 

Quindi la corrispondenza delle espressioni regolari viene eseguita due volte. C'è un modo in cui posso accedere a \\1 nell'azione senza corrispondere di nuovo?

Sto cercando di ridurre sia la corrispondenza di pattert che il codice aggiuntivo.

+0

sembra come risposta qui: http://stackoverflow.com/questions/2957684/awk-access-captured-group-from-line-pattern – Slartibartfast

+0

@Slartibartfast aiuta. Non ho trovato questa domanda prima di postare, quindi grazie. Comunque, come per [this] (http://stackoverflow.com/a/4673336/18573) risposta devo usare la 'partita ($ 0 ....' che è una specie di brutto ma non proprio –

risposta

7

Sfortunatamente, GAWK, non ha la funzione carry-forward di sed che utilizza uno // vuoto.

sed '/\(patt\)ern/ {s//new\1/}' inputfile 

Tuttavia, si può gioire poiché le variabili sono state inventate di recente e possono essere utilizzate proprio per questo scopo!

BEGIN { 
    pattern = "^Compiled from \"(.*)\"$" 
} 
$0 ~ pattern { 
    file_name = gensub(pattern, "\\1", ""); 
    print file_name; 
} 
+0

ero già stato usando le variabili, ma lo accetto perché risponde alla mia domanda. –

Problemi correlati