Korzystanie z wyrażeń regularnych w AWK

Korzystanie z wyrażeń regularnych w AWK

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:

MetacharacterOpis
.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:

awk 'if (match (0 $, /\.com $/)) drukuj 0 $ '.tekst
12345awk '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:

AWK 'sub (/555/, „666”, 0 $) Drukuj 0 $ „.tekst
1234AWK '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 „.tekst
12345678awk '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.tekst
1234awk '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.txt
12345awk '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.tekst
12345awk '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.tekst
12345awk '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.