Korzystanie z wyrażeń regularnych w AWK
- 1137
- 285
- Tomasz Szatkowski
Wyrażenia regularne są potężnym narzędziem do przetwarzania tekstu w AWK. Pozwalają na wyszukiwanie wzorów w pliku tekstowym i manipulowanie danymi na podstawie tych wzorców. W tym artykule zbadamy, jak korzystać z wyrażeń regularnych w AWK z przykładami.
Podstawy ekspresji regularnej
Wyrażenia regularne to wzorce pasujące do określonego zestawu znaków. Poniższa tabela zawiera niektóre z podstawowych metacharaktów wyrażenia regularnego, których można użyć w AWK:
Metacharacter | Opis |
---|---|
. | Dopasowuje dowolny pojedynczy znak |
[] [] | Pasuje do dowolnej postaci w nawiasach |
^ | Pasuje do początku linii |
$ | Odpowiada koniec linii |
* | Odpowiada zerowi lub więcej wystąpień poprzedniej postaci |
+ | Pasuje do jednego lub więcej wystąpień poprzedniej postaci |
? | Odpowiada zerowi lub jednym wystąpieniu poprzedniej postaci |
AWK zapewnia dwie wbudowane funkcje do korzystania z wyrażeń regularnych: mecz()
I pod()
. mecz()
funkcja służy do znalezienia pierwszego występowania wyrażenia regularnego w ciągu i pod()
służy do zastąpienia pierwszego wystąpienia wyrażenia regularnego w ciągu. Oto kilka przykładów:
Przykład 1: Dopasowanie wyrażenia regularnego
Załóżmy, że mamy plik zawierający listę adresów e -mail i chcemy znaleźć wszystkie adresy e -mail, które kończą się ".com ”. Możemy użyć mecz()
funkcja wykonania tego zadania w następujący sposób:
12345 | awk 'if (match (0 $, /\.com $/)) drukuj 0 $ '.tekst |
Tutaj używamy mecz()
funkcja wyszukiwania wyrażenia regularnego /.com $/ (który pasuje do każdego ciągu, który kończy się „.com ”) w każdym wierszu pliku. Jeśli zostanie znaleziony mecz, drukujemy linię.
Przykład 2: Zastąpienie wyrażenia regularnego
Powiedzmy, że mamy plik zawierający listę numerów telefonów i chcemy zastąpić wszystkie instancje „555” z „666”. Możemy użyć pod()
funkcja wykonania tego zadania w następujący sposób:
1234 | AWK 'sub (/555/, „666”, 0 $) Drukuj 0 $ „.tekst |
Tutaj używamy pod()
funkcja wyszukiwania wyrażenia regularnego /555/ (który pasuje do dowolnego ciągu zawierającego „555”) w każdym wierszu pliku i zastąp go za pomocą „666”. Następnie drukujemy zmodyfikowaną linię.
Zaawansowane techniki ekspresji regularnej
Oprócz podstawowych metacharakterów wyrażenia regularnego, AWK obsługuje kilka zaawansowanych technik ekspresji regularnej, które mogą pomóc w wykonaniu bardziej złożonych zadań przetwarzania tekstu. Obejmują one:
1. Grupowanie:
Możesz grupować części wyrażenia regularnego razem za pomocą nawiasów. Pozwala to zastosować kwantyfikator do grupy jako całości lub wyodrębnić określone części dopasowanego ciągu.
Powiedzmy, że mamy plik zawierający listę nazwisk i wynagrodzeń pracowników i chcemy osobno wyodrębnić nazwy i pensje. Możemy użyć grupowania, aby wykonać to zadanie w następujący sposób:
awk 'if (match (0 $, /^(\ w+) \ s+(\ d+) $ /)) name = substr ($ 0, rstart, rlength) pensja = substr ($ 0, rstart+długość (nazwa) +1 +1 , długość (0 $) -RSTART-długość (nazwa)) Nazwa drukowania Wydrukuj wynagrodzenie „.tekst12345678 | awk 'if (match (0 $, /^(\ w+) \ s+(\ d+) $ /)) name = substr ($ 0, rstart, rlength) pensja = substr ($ 0, rstart+długość (nazwa) +1 +1 , długość (0 $) -RSTART-długość (nazwa)) Nazwa drukowania Wydrukuj wynagrodzenie „.tekst |
Tutaj używamy grupowania, aby dopasować wyrażenie regularne /^(\ w+) \ s+(\ d+) $ / (który pasuje do linii zawierającej jeden lub więcej znaków słów, a następnie jeden lub więcej znaków białych, a następnie jedną lub więcej cyfr) i wyodrębnij nazwę i wynagrodzenie osobno.
2. Odniesienia:
Możesz użyć referencji (i.mi., \ 1, \ 2 itp.) w odniesieniu do części wyrażenia regularnego, które były dopasowane przez grupę. To pozwala na ponowne wykorzystanie dopasowanych podłoży w ciągu zastępczego.
Załóżmy, że mamy plik zawierający listę numerów telefonów w formacie (xxx) xxx-xxxx i chcemy zmienić format na xxx-xxx-xxxx. Możemy użyć referencji, aby wykonać to zadanie w następujący sposób:
awk 'sub (/\ (\ d 3) \) (\ d 3)-(\ d 4)/, "\ 1- \ 2- \ 3", 0 $) Drukuj 0 $ „Telefon.tekst1234 | awk 'sub (/\ (\ d 3) \) (\ d 3)-(\ d 4)/, "\ 1- \ 2- \ 3", 0 $) Drukuj 0 $ „Telefon.tekst |
Tutaj używamy referencji (i.mi., \ 1, \ 2 i \ 3) w celu odniesienia się do trzech grup cyfr dopasowanych przez wyrażenie regularne „/(\ D3) (\ d3) (\ d 3)-(\ d 4)/” (który pasuje do numeru telefonu w formacie (xxx) xxx-xxxx) i wymień format xxx-xxx-xxxx.
3. Lookahead i Lookbehind:
Możesz użyć Lookahead (?=) i Lookbehind (?<=) do dopasowania wzorów tylko wtedy, gdy podąża ich odpowiednio lub poprzedzone innym wzorem.
Powiedzmy, że mamy plik zawierający listę adresów URL i chcemy wyodrębnić tylko nazwy domen (i.mi., tekst między „Http: //” i następny „/” postać). Możemy użyć Lookahead i Lookbehind, aby wykonać to zadanie w następujący sposób:
awk 'if (match (0 $, /(?<=http:\/\/)[^\/]+/)) print substr($0, RSTART, RLENGTH) ' urls.txt12345 | awk 'if (match (0 $, /(?<=http:\/\/)[^\/]+/)) print substr($0, RSTART, RLENGTH) ' urls.txt |
Tutaj używamy Lookahead (?<=) Aby dopasować wyrażenie regularne „/(?<=http://)[^/]+/" (który pasuje do wszelkich postaci, które pojawiają się później „Http: //” i przed następnym „/” znak) i wyodrębnij nazwę domeny.
4. Negowane klasy postaci:
Załóżmy, że mamy plik zawierający listę adresów e -mail i chcemy wyodrębnić tylko adresy należące do określonej domeny (e.G., przykład.com). Możemy użyć negowanych klas znaków, aby wykonać to zadanie w następujący sposób:
awk 'if (match (0 $, /^[^@]+@przykład \.com $/)) print 0 $ 'e -maile.tekst12345 | awk 'if (match (0 $, /^[^@]+@przykład \.com $/)) print 0 $ 'e -maile.tekst |
Tutaj używamy klasy negowanej postaci ([^@]+) Aby dopasować dowolne postacie, które nie są „@” i wyodrębnij nazwę użytkownika, a następnie dopasuj dosłowny ciąg "@przykład.com ” Aby upewnić się, że adres należy do określonej domeny.
5. Alternacja:
Załóżmy, że mamy plik zawierający listę numerów telefonów i chcemy wyodrębnić tylko liczby, które są albo w formacie „(xxx) xxx-xxxx” lub „xxx-xxx-xxxx”. Możemy użyć naprzemienności, aby wykonać to zadanie w następujący sposób:
awk 'if (match (0 $, /\ (\ d 3) \) (\ d 3)-(\ d 4) | (\ d 3)-(\ d 3 3 )-(\ d 4)/)) PRINK SUBSTSTR (0 $, rstart, rlength) 'telefony.tekst12345 | awk 'if (match (0 $, /\ (\ d 3) \) (\ d 3)-(\ d 4) | (\ d 3)-(\ d 3 3 )-(\ d 4)/)) PRINK SUBSTSTR (0 $, rstart, rlength) 'telefony.tekst |
Tutaj używamy naprzemienności (|) Aby dopasować albo wyrażenie regularne „/(\ D3) (\ d3) (\ d 3)-(\ d 4)/” (który pasuje do numeru telefonu w formacie (xxx) xxx-xxxx) lub wyrażenia regularne „/(\ D 3)-(\ d 3)-(\ d 4)/” (który pasuje do numeru telefonu w formacie xxx-xxx-xxxx).
Wniosek
Wyrażenia regularne są potężnym narzędziem do przetwarzania tekstu w AWK. Umożliwiają wyszukiwanie wzorów w pliku tekstowym i manipulowanie danymi na podstawie tych wzorców. Opanowując wyrażenia regularne w AWK, możesz stać się bardziej skuteczny i wydajny w zadaniach przetwarzania tekstu i z łatwością wykonać złożoną manipulację danymi.