2013-01-08 17 views
5

ich einen regulären Ausdruck schreiben müssen, um mit der folgenden Muster entsprechen:Regulärer Ausdruck ein Muster innerhalb awk

fltr_desc_name 

, die .. „vl“ durch eine von einer beliebigen Anzahl von Wörtern gefolgt Strich gefolgt ist getrennt durch Unterstrich.

zum Beispiel: Ich brauche einen regulären Ausdruck der folgenden entsprechen:

fltr_desc_name 
fltr_nameone_nametwo 
fltr_level_name_desc 

und ich bin mit ihm innerhalb einer "if" Anweisung in "awk": für ex:

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

Bitte helfen Sie mir beim Schreiben der regulären Ausdruck und sagen Sie mir, wie man regulären Ausdruck innerhalb einer "if" Bedingung innerhalb "awk" Befehl verwenden. Vielen Dank.

+1

, was Sie bisher versucht haben !! und warum regulärer Ausdruck. Verwenden Sie String-Funktion für das – diEcho

+0

Hallo :), Ich benutze die Regex, um alle Zeilen zu finden, deren Transformation Feldtyp ist Filter, ($ 4, 4. Feld wie in der Datei angegeben) und $ 5 ist der Name des Filters, der Shld b des Formats "fltr_followedbyanywrdsseparatedbyunderscore". und so benutzte ich den awk cmd wie in der Frage gezeigt, aber ich konnte die Zeilen nicht bearbeiten. – Karthik

Antwort

4

Sie

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

Keine Notwendigkeit, eine if Anweisung verwenden verwenden könnte, können Sie einfach mehrere passende Bedingungen wie oben beschrieben prüfen. match gibt die Übereinstimmungsstelle der Regex ^fltr_[A-Za-z_]+ in $5 zurück, oder 0, wenn keine vorhanden ist. 0 ergibt false und alles andere als wahr.

+0

Vielen Dank.Es hat gut funktioniert :) Prost – Karthik

+2

@Karthik Das Spiel() ist nicht notwendig. Ihr Hauptproblem bestand lediglich darin, dass Sie einen String-Vergleichsoperator (==) anstelle eines RE-Vergleichsoperators (~) verwenden. Ich werde die echte Lösung veröffentlichen. –

+0

@EdMorton, nett - suchte nach einem Regex-Operator in 'man awk', aber es wurde nicht unter den anderen Operatoren aufgeführt, also habe ich es verpasst und stattdessen' match' gewählt. Vielen Dank! –

1

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

oder wenn Sie von Zeichenfolge übereinstimmen soll nur String Ende starten:

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

+0

+1 für nicht endend mit einem Unterstrich, obwohl es nicht ausdrücklich –

+0

@ sharp12345, Vielen Dank für Ihre Antwort angegeben wurde. :) – Karthik

0

Sie nur fltr_\w+

verwenden können, wenn Sie ein gutes Programm zum Schreiben brauchen und Test Regex. versuchen, dieses: http://gskinner.com/RegExr/

+0

OP will awk, nicht perl. –

+0

@selltheworld Vielen Dank für Ihren Vorschlag und auch den Link :) – Karthik

0

Versuchen Sie, diese

^fltr[_\d\w]+$ 

Es wird alles nehmen, was Sie brauchen.

+0

OP will awk, nicht perl. Zusätzlich enthält "\ w" schon '_' und' \ d' - http://perldoc.perl.org/perlrecharclass.html#Word-zeichen –

+0

@og Grand, Danke für deine Antwort. Ich werde deinen Vorschlag auch versuchen :) – Karthik

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

+1 für die Verwendung der locale-aware-Zeichenklasse. Für die Allgemeinheit würde ich '[: alnum:]' verwenden, obwohl es nicht angegeben wurde. –

+1

Das OP erklärte die Zeichenfolge enthalten "Wörter durch Unterstreichung getrennt" und, zumindest in meinem Kopf, ** Wörter ** enthalten keine Zahlen, aber YMMV nehme ich an. –

+0

Ich kann das sehen, vor allem angesichts des Beispiels 'fltr_nameone_nametwo', aber es ist nicht eine Strecke, das zu' fltr_name1_name2' zu erweitern –

9

Need ~/ / Tilde-Zeichen zu verwenden, in passenden regulären Ausdrücken in awk, das heißt

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

es hat wirklich geholfen – SeeTheC