Używając awk
, muszę znaleźć słowo w pliku, które pasuje do wzorca regex.
Chcę tylko wydrukować słowo dopasowane do wzoru.
Więc jeśli w linii mam:
xxx yyy zzz
I wzór:
/yyy/
Chcę tylko:
yyy
EDYCJA: dzięki kurumi udało mi się napisać coś takiego:
awk '{
for(i=1; i<=NF; i++) {
tmp=match($i, /[0-9]..?.?[^A-Za-z0-9]/)
if(tmp) {
print $i
}
}
}' $1
i właśnie tego potrzebowałem :) wielkie dzięki!
tmp=match($i, /regexp);if(tmp){}
, po prostu powinieneś być w stanie to zrobić,if(tmp ~ $i){}
ponieważ~
oznacza „pasuje do wyrażenia regularnego”.Odpowiedzi:
To jest bardzo podstawowe
poproś
awk
o wyszukaniepattern
użycia//
, a następnie wydrukuj wiersz, który domyślnie nazywa się rekordem, oznaczony przez $ 0. Przeczytaj przynajmniej dokumentację .Jeśli chcesz tylko uzyskać, wydrukuj dopasowane słowo.
źródło
print
jest to akcja domyślna:awk '/pattern/' file
wystarczy.for
-loop działał, jeśli (a) „yyy” jest wyrażeniem regularnym, a nie prostym ciągiem, oraz (b) jeśli „yyy” nie pasuje do całego pola w nagranie.$i=="yyy"
; byłoby to$i ~ /yyy/
dla wyrażenia regularnego.Wygląda na to, że próbujesz naśladować
grep -o
zachowanie GNU . To zrobi to pod warunkiem, że chcesz tylko pierwszy mecz w każdej linii:Oto przykład użycia
awk
implementacji GNU (gapić się):Przeczytaj o
match
,substr
,RSTART
orazRLENGTH
wawk
instrukcji.Następnie możesz chcieć rozszerzyć to, aby poradzić sobie z wieloma dopasowaniami w tej samej linii.
źródło
gawk może pobrać pasującą część każdej linii, używając tego jako akcji:
źródło
Jeśli interesuje Cię tylko ostatnia linia danych wejściowych i spodziewasz się znaleźć tylko jedno dopasowanie (na przykład część linii podsumowania polecenia powłoki), możesz również wypróbować ten bardzo zwarty kod, przyjęty z Jak drukować dopasowania wyrażeń regularnych używając „awk”? :
Lub bardziej złożona wersja z częściowym wynikiem:
Ostrzeżenie:
awk
match()
funkcja z trzema argumentami istnieje tylko wgawk
, nie wmawk
Oto kolejne fajne rozwiązanie wykorzystujące lookbehind regex w
grep
zamiastawk
. To rozwiązanie ma mniejsze wymagania dotyczące instalacji:źródło
Jeśli Perl jest opcją, możesz spróbować tego:
Aby zaimplementować dopasowanie bez rozróżniania wielkości liter, dodaj
i
modyfikatorAby wydrukować wszystko PO meczu:
Aby wydrukować dopasowanie i wszystko po dopasowaniu:
źródło
Używanie seda również może być eleganckie w tej sytuacji. Przykład (zamień wiersz na dopasowaną grupę „yyy” z wiersza):
Odpowiednia strona podręcznika: https://www.gnu.org/software/sed/manual/sed.html#Back_002dreferences-and-Subexpressions
źródło
sed -n 's/^.*\(yyy\).*$/\1/gp' < testfile
Poza tematem, można to zrobić również za pomocą grepa, po prostu umieszczając go tutaj na wypadek, gdyby ktoś szukał rozwiązania grep
źródło
Jeśli wiesz, w której kolumnie znajduje się tekst / wzorzec, którego szukasz (np. „Yyy”), możesz po prostu sprawdzić tę konkretną kolumnę, aby zobaczyć, czy pasuje, i wydrukować.
Na przykład mając plik z następującą zawartością (nazywany asdf.txt )
aby wydrukować tylko drugą kolumnę, jeśli pasuje ona do wzorca „yyy”, możesz zrobić coś takiego:
Zwróć uwagę, że będzie to również pasować do każdego wiersza, w którym druga kolumna zawiera „yyy”, na przykład:
źródło