2013-01-08 12 views
5

ho bisogno di scrivere un'espressione regolare che corrisponda al seguente schema:un'espressione regolare per trovare un modello all'interno comando awk

fltr_desc_name 

che è .. "FLTR" seguito da un trattino seguito da un qualsiasi numero di parole separati da underscore.

per esempio: Ho bisogno di un espressione regolare che corrisponda al seguente:

fltr_desc_name 
fltr_nameone_nametwo 
fltr_level_name_desc 

e lo sto usando all'interno di un "if" in "awk": es:

awk '/Transformation/ { if ($4=="Filter" && $5=="fltr_*") print $4,$5 }' filename 

per favore aiutami a scrivere l'espressione regolare e dimmi come usare l'espressione regolare all'interno di una condizione "se" all'interno del comando "awk". Grazie.

+1

quello che hai provato finora !! e perché espressione regolare. usa la funzione stringa per quello – diEcho

+0

Ciao :), Sto usando la regex per trovare tutte le righe il cui tipo di campo di trasformazione è Filtro, (cioè $ 4, 4 ° campo come indicato nel file) e $ 5 è il nome del filtro che shld b del formato "fltr_followedbyanywrdsseparatedbyunderscore". e così stavo usando il cmd di awk come mostrato nella domanda, ma non ero in grado di cancellare le linee. – Karthik

risposta

4

Si potrebbe utilizzare

awk '/Transformation/ && $4=="Filter" && match($5, /^fltr_[A-Za-z_]+/) { print $4,$5 }' filename 

Non c'è bisogno di utilizzare un if dichiarazione, si può semplicemente utilizzare più condizioni di accordo di cui al precedente. match restituisce la posizione di corrispondenza della regex ^fltr_[A-Za-z_]+ in $5 o 0 se non ce n'è. 0 giudica false e qualsiasi altra cosa vera.

+0

Grazie mille.Ha funzionato bene :) evviva – Karthik

+2

@Karthik La corrispondenza() non è necessaria. Il tuo problema principale era che stavi usando un operatore di confronto delle stringhe (==) invece di un operatore di confronto RE (~). Pubblicherò la vera soluzione. –

+0

@EdMorton, bello - cercava un operatore di espressioni regolari in 'uomo awk', ma non era elencato tra gli altri operatori, quindi mi mancava e usavo invece' match'. Grazie! –

1

fltr_[a-zA-Z_]+[a-zA-Z]

o se si desidera far corrispondere da stringa iniziare solo alla fine della stringa:

^fltr_[a-zA-Z_]+[a-zA-Z]$

+0

+1 per non terminare con un carattere di sottolineatura, anche se non è stato specificato esplicitamente –

+0

@ sharp12345, Grazie per la risposta. :) – Karthik

0

si potrebbe utilizzare fltr_\w+

se avete bisogno di un buon programma per la scrittura e test regex. provare questo: http://gskinner.com/RegExr/

+0

OP vuole awk, non perl. –

+0

@selltheworld Grazie per il tuo suggerimento e anche il link :) – Karthik

0

Prova questa

^fltr[_\d\w]+$ 

ci vorrà tutto, è necessario.

+0

OP vuole awk, non perl. Inoltre, '\ w' include' _' e '\ d' già - http://perldoc.perl.org/perlrecharclass.html#Word-characters –

+0

@og Grand, Grazie per la risposta. Proverò anche tu il tuo suggerimento :) – Karthik

7
awk '/Transformation/ && $4=="Filter" && $5~/^fltr_[[:alpha:]_]+/ { print $4,$5 }' filename 
+1

+1 per l'utilizzo della classe di caratteri che riconosce le impostazioni internazionali. Per generalità, userei '[: alnum:]' anche se non è stato dichiarato. –

+1

L'OP ha dichiarato che la stringa conteneva "parole separate da trattino basso" e, almeno nella mia testa, ** parole ** non contengono numeri ma YMMV suppongo. –

+0

Posso vedere che, in particolare dato l'esempio 'fltr_nameone_nametwo', ma non è un allungamento per estenderlo a' fltr_name1_name2' –

9

necessità di utilizzare il carattere tilde ~/ / in corrispondenza espressioni regolari in awk, vale a dire

if ($5 ~ /fltr_*/) 
+0

mi ha davvero aiutato – SeeTheC

Problemi correlati