2013-01-08 17 views
5

muszę napisać wyrażenie regularne pasujące do następującego wzoru:Wyrażenie regularne pasujące do wzorca wewnątrz polecenia awk

fltr_desc_name 

że jest .. „FLTR”, a następnie znaku podkreślenia następnie dowolną liczbę słów oddzielone podkreśleniem.

na przykład: Potrzebuję wyrażenia regularnego, aby dopasować następujące:

fltr_desc_name 
fltr_nameone_nametwo 
fltr_level_name_desc 

i używam go wewnątrz "if" w "awk": dla Ex:

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

proszę pomóżcie mi w napisaniu wyrażenia regularnego i powiedzcie mi, jak używać wyrażenia regularnego wewnątrz warunku "jeśli" w komendzie "awk". Dziękuję Ci.

+1

czego próbowałem tak daleko !! i dlaczego wyrażenie regularne. użyj funkcji string do tego – diEcho

+0

Hello :), Używam regex, aby znaleźć wszystkie linie, których typem pola tranformacji jest Filter, (tj. 4 $, 4. pole podane w pliku), a 5 $ jest nazwą filtru, który ma format pliku "fltr_followedbyanywrdsseparatedbyunderscore". i tak używałem awk cmd, jak pokazano w pytaniu, ale nie byłem w stanie ukończyć linii. – Karthik

Odpowiedz

4

Można użyć

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

Nie trzeba używać oświadczenie if, można po prostu korzystać z wielu warunków dopasowywania jak powyżej. match zwraca położenie dopasowania polecenia regex ^fltr_[A-Za-z_]+ w $5 lub 0, jeśli nie ma żadnego. 0 oznacza fałsz i cokolwiek innego na true.

+0

Wielkie dzięki.To działało Dobrze :) Pozdrawiam – Karthik

+2

@Karthik Dopasowanie() jest niepotrzebne. Głównym problemem było to, że używałeś operatora porównywania ciągów znaków (==) zamiast operatora porównania RE (~). Opublikuję prawdziwe rozwiązanie. –

+0

@EdMorton, nice - szukał operatora regex w 'man awk', ale nie był wymieniony wśród innych operatorów, więc przegapiłem go i zamiast tego wybrałem opcję' match'. Dzięki! –

1

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

lub jeśli chcesz dopasować z ciągiem zacząć końcu łańcucha tylko:

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

+0

+1 za niezakończenie podkreślenia, mimo że nie zostało to wyraźnie stwierdzone. –

+0

@ sharp12345, Dziękuję za odpowiedź. :) – Karthik

0

można po prostu użyć fltr_\w+

jeśli potrzebujesz dobry program do pisania i testowanie regex. spróbuj tego: http://gskinner.com/RegExr/

+0

OP chce awk, nie perl. –

+0

@selltheworld Dziękuję za sugestię i link :) – Karthik

0

Spróbuj

^fltr[_\d\w]+$ 

To zajmie wszystko, czego potrzebujesz.

+0

OP chce awk, nie perl. Dodatkowo '\ w' zawiera już' _' i '\ d' - http://perldoc.perl.org/perlrecharclass.html#Word-characters –

+0

@og Grand, Dzięki za twoją odpowiedź. Spróbuję też twojej sugestii :) – Karthik

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

+1 za korzystanie z klasy znaków obsługującej locale. Ogólnie rzecz biorąc, użyłbym '[: alnum:]' mimo że nie zostało to określone. –

+1

OP stwierdził, że ciąg zawierał "wyrazy rozdzielone podkreśleniem" i, przynajmniej w mojej głowie, ** słowa ** nie zawierają liczb, ale przypuszczam, że YMMV. –

+0

Widzę to, szczególnie biorąc pod uwagę przykład 'fltr_nameone_nametwo', ale nie rozciągać go na' fltr_name1_name2' –

9

trzeba użyć znaku tyldy w ~/ / dopasowanie wyrażeń regularnych w awk, tj

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

to naprawdę pomogło – SeeTheC

Powiązane problemy