Menu
Jest wolny
Zameldować się
główny  /  Programy / Regularne wyrażenia UNIX. Korzystanie z wyrażeń regularnych (Regex) w Linuksie

Regularne wyrażenia UNIX. Korzystanie z wyrażeń regularnych (Regex) w Linuksie

Oryginalny: Podstawy Linux
Wysłany przez: Paul Cobbaut
Data publikacji: 16 października 2014
Tłumaczenie: A.Panin.
Data tłumaczenia: 17 grudnia 2014

Rozdział 19. Wyrażenia regularne

Mechanizm wyrażeń regularnych jest bardzo potężnym narzędziem Linuksa. Wyrażenia regularne Może być używany podczas pracy z różnymi programami, takimi jak bash, VI, zmiana nazwy, grep, sed i innych.

W tym rozdziale przedstawia podstawowe informacje o wyrażeniach regularnych.

Regularne wersje składni ekspresji

Istnieją trzy różne wersje wyrażeń regularnych: podstawowe wyrażenia regularne (podstawowa składnia wyrażeń regularnych) ere: rozszerzone wyrażenia regularne (zaawansowana składnia wyrażeń regularnych) PCRE: Perl Wyrażenia regularne (Składnia regularnego języka programowania

W zależności od używanego narzędzia można użyć jednej lub więcej wymienionych określenia.

Na przykład narzędzie GREP obsługuje parameter -e, co pozwala na korzystanie z rozszerzonych wyrażeń regularnych (Ere) Składnia (Ere) podczas analizowania wyrażenia regularnego, które w czasie jako parametru -G pozwala na użycie podstawowej składni Wyrażenia regularne (BRE) i parametr -P - składnia wyrażeń regularnych języka programowania PERL (PCRE).

Biorąc pod uwagę fakt, że narzędzie Grep obsługuje również parametr -F, który umożliwia odczytanie wyrażenia regularnego bez przetwarzania.

Narzędzie SED obsługuje również parametry do wyboru składni wyrażeń regularnych.

Zawsze czytaj wytyczne używanych instrumentów!

Narzędzie grep.

Zawarcie ciągów pasujących do szablonu

Utility GREP jest popularnym narzędziem Linux przeznaczony do wyszukiwania linii pasujących do konkretnego szablonu. Poniżej znajdują się przykłady najprostszych wyrażeń regularnych, które mogą być używane podczas pracy z nim.

Jest to zawartość pliku testowego używanego w przykładach. Ten plik zawiera trzy linie (lub trzy symbole nowej linii). [Chroniony e-mail]: ~ $ Cat imiona Tania Laura Valentina

Podczas wyszukiwania oddzielnego znaku zostaną wyświetlone tylko te linie zawierające określony symbol. [Chroniony e-mail]: ~ $ Grep U Names Laurę [Chroniony e-mail]: ~ $ Grep e imiona Valentina [Chroniony e-mail]: ~ $ Grep I imion Tania Valentina

Porównanie z szablonem używanym w tym przykładzie jest oczywiste; W przypadku, gdy określony symbol zostanie znaleziony w ciągu, narzędzie GREP wyświetli ten ciąg.

Łączenie symboli

Aby wyszukać kombinacje znaków w liniach, symbole wyrażenia regularnego powinny być łączone w ten sam sposób.

Ten przykład pokazuje zasadę działania narzędzia GREP, zgodnie z którym wyrażenie regularne Ia będzie odpowiadać ciągiem Tan IA, ale nie łańcuchu VA Lent I Na, a wyrażenie regularne w walce w linii, ale nie Ta ni a. [Chroniony e-mail]: ~ $ Grep a imiona Tania Laura Valentina [Chroniony e-mail]: ~ $ Grep Ia imimy Tania [Chroniony e-mail]: ~ $ Grep w imionach Valentina [Chroniony e-mail]:~$

Jeden lub inny symbol

Zarówno w składni PCRE, jak iw składni Ere, można użyć symbolu tworzenia kanału oprogramowania, które w tym przypadku, w tym przypadku prześle operację logiczną "lub". W tym przykładzie będziemy szukać wraz z narzędziami Ciągów, w których występuje znak I lub symbol a. [Chroniony e-mail]: ~ $ Cat List Tania Laura [Chroniony e-mail]: ~ $ Grep -e "I | Lista Tania Laurowa

Należy pamiętać, że korzystamy z parametrów -e narzędzi w celu przymocowanej interpretacji naszego regularnego wyrażenia jako wyrażenie przy użyciu regularnej składni wyrażeń regularnych (Ere).

Będziemy musieli osłonić symbolem tworzenia kanału oprogramowania w wyrażeniu regularnym przy użyciu podstawowej składni wyrażeń regularnych (BRE) dla podobnej interpretacji tej postaci jako logicznej pracy "lub". [Chroniony e-mail]: ~ $ Grep -g "I | a" lista [Chroniony e-mail]: ~ $ Grep -g "I" A "Lista Tania Laura

Jeden lub więcej zbiegów

Symbol * odpowiada zero, jeden lub więcej wpisach poprzedniego symbolu i + - kolejnego symbolu znaków. [Chroniony e-mail]: ~ $ Cat List2 ll lol lool Loool [Chroniony e-mail]: ~ $ Grep -e "O *" List2 ll lol lool Loool [Chroniony e-mail]: ~ $ Grep -e "O +" List2 lol Lool Loool [Chroniony e-mail]:~$

Zbieg okoliczności na końcu ciągu

W poniższych przykładach użyjemy tego pliku: [Chroniony e-mail]: ~ $ Cat imiona Tania Laura Valentina Fleur Flour

W dwóch przykładach następująca jest metodą używania symbolu dolara, aby wyszukać zbieg okoliczności na końcu linii. [Chroniony e-mail]: ~ $ Grep A $ Names Tania Laura Valentina [Chroniony e-mail]: ~ $ Grep R $ Names Fleur Flour

Zbieg okoliczności na początku linii

Symbol wstawiania (^) umożliwia wyszukiwanie zbiegu okoliczności na początku (lub z pierwszych znaków) ciąg.

W tych przykładach stosuje się powyższy plik. [Chroniony e-mail]: ~ $ Grep ^ val imiona Valentina [Chroniony e-mail]: ~ $ Grep ^ f Nazwy Fleur Flour

Symbole dolara i wkładki stosowane w wyrażeniach regularnych są nazywane kotwicami (kotwice).

Oddzielenie słów

Osłanie poszukiwanych słów za pomocą symboli Gap nie jest dobrym rozwiązaniem (ponieważ inne znaki mogą być również używane jako separatory słowne). W poniższym przykładzie pokazuje metodę korzystania z sekwencji znaków b, aby wyszukać wiersze z danym słowem, a nie sekwencją znaków: [Chroniony e-mail]: ~ $ Grep "Bover B" Tekst zima się skończył. Czy możesz tam dotrzeć? [Chroniony e-mail]:~$

Należy pamiętać, że narzędzie GREP obsługuje również parametr -w zaprojektowany, aby wyszukać wyszukiwanie. [Chroniony e-mail]: ~ $ CAT TEXT GERMENDER rządzi. Zima się skończyła. Czy możesz tam dotrzeć? [Chroniony e-mail]: ~ $ GREP -W nad tekstem zima się skończyła. Czy możesz tam dotrzeć? [Chroniony e-mail]:~$

Ustawienia Narzędzia Grep.

Czasami okazuje się być łatwiejsze w połączeniu prostego wyrażenia regularnego z parametrami narzędzia GREP, zamiast stworzyć bardziej złożone wyrażenie regularne. Parametry te omówiono wcześniej: Grep -i Grep -v Grep -W Grep -a5 GREP -B5 GREP -C5

Zapobieganie ujawnianiu wyrażenia regularnego przez powłokę poleceń

Symbol dolara jest specjalnym symbolem zarówno do wyrażenia regularnego, jak i do powłoki poleceń (pamiętaj o zmiennych powłoki poleceń i osadzone skorupy poleceń). Na tej podstawie zaleca się osłaniać wyrażenia regularne w żadnych okolicznościach, ponieważ przesiewanie wyrażenia regularnego pozwala zapobiec ujawnianiu tego wyrażenia przez powłokę poleceń. [Chroniony e-mail]: ~ $ Grep "R $" imiona Fleur Floor Rename

Zmiana nazwy użytkowej.

Wdrożenie narzędzia zmiany nazwy

W dystrybucji Linux Dystrybucja / Usr / Bin / Rename Ścieżka jest linkiem do scenariusza / Usr / Bin / Prenelame, zainstalowany z pakietu Perl. [Chroniony e-mail] ~ $ DPKG -S $ (Readlink -F $ (która zmienia nazwa) Perl: / usr / bin / preneame

W dystrybucji opartych na dystrybucji czerwonego kapelusza nie jest utworzone podobnym symbolicznym odniesieniem, aby określić opisany skrypt (oczywiście, z wyjątkiem przypadków, gdy tworzony jest link symboliczny do zestawu skryptu ręcznie.), Więc ta sekcja nie będzie opisana Zmień nazwę narzędzie z dystrybucji Czerwony kapelusz.

W dyskusjach na temat narzędzia do Internetu w Internecie występują zwykle zamieszanie ze względu na fakt, że decyzje, które doskonale pracują w dystrybucji debian (jak również Ubuntu, Xubuntu, Mint, ...) nie mogą być używane w dystrybucji czerwonego kapelusza (jak Jako Centos, Fedora, ...).

Pakiet Perl.

Komenda Zmień nazwę jest w rzeczywistości wdrożona w formie skryptu przy użyciu regularnych języków programowania PERL. Dzięki pełnym instrukcji obsługi tego skryptu można odczytać po wprowadzeniu komendy Perldoc Perlrequick (po zainstalowaniu pakietu Perldoc). [Chroniony e-mail]: ~ ~ #ptitude install Perl-Doc Następujące nowe pakiety zostaną zainstalowane: PERL-DOC 0 pakietów Zaktualizowano, 1 zainstalowany nowe, 0 pakietów nie można usunąć, a 0 pakietów nie są aktualizowane. Konieczne jest uzyskanie archiwów 8,170 KB. Po rozpakowaniu 13,2 MB zostanie zajęty. Zdobądź: 1 http://mirrordirector.raspbian.org/raspbian/ Wheezy / Main Perl-Do ... 8,170 KB w 19c (412 KB / s) Wybierz poprzednio wybrany pakiet Perl-Doc. (Czytanie bazy danych ... na ten moment Zainstalowany plik i katalog 67121 Stud autorstwa Perl-DoC "przetworzone wyzwalacze dla MAN-DB ... Pakiet PERL-DOC jest skonfigurowany (5.14.2-21 + RPI2) ... [Chroniony e-mail]: ~ # Perldoc perlrequick

Dobrze znana składnia

Najczęściej, narzędzie do zmiany nazwy służy do wyszukiwania plików o nazwach odpowiadających konkretnym szablonie w postaci ciągów i zastąpić ten ciąg do innej linii.

Zazwyczaj ta czynność jest opisana przy użyciu wyrażenia regularnego S / String / innej linii /, jak pokazano na przykładzie: [Chroniony e-mail] ~ $ LS ABC Allfiles.txt Bllfiles.txt Scratch Tennis2.txt abc.conf Backup cllfiles.txt temp.txt tennis.txt [Chroniony e-mail] ~ $ Zmień nazwę "S / TXT / Tekst /" * [Chroniony e-mail] ~ $ LS ABC Allfiles.Text Bllfiles.Text Scratch Tennis2.Text abc.conf Backup cllfiles.Text temp.text tennis.Text

A poniżej jest innym przykładem, który wykorzystuje dobrze znaną składnię narzędzia zmiany nazwy, aby wielokrotnie zmieniać rozszerzenia tych samych plików: [Chroniony e-mail] ~ $ LS ABC Allfiles.Text Bllfiles.Text Scratch Tennis2.Text abc.conf Backup cllfiles.Text temp.text tennis.Text [Chroniony e-mail] ~ $ Zmień nazwę "S / TEXT / TXT /" * .Text [Chroniony e-mail] ~ $ LS ABC Allfiles.txt Bllfiles.txt Scratch Tennis2.txt abc.conf Backup cllfiles.txt temp.txt tennis.txt [Chroniony e-mail] ~ $

Te dwa przykłady mogą być możliwe do sprawku z tego powodu, że stosowane struny znajdują się wyłącznie w rozszerzeniach plików. Nie zapominaj, że rozszerzenia plików nie mają znaczenia podczas pracy z powłoki poleceń bash.

Poniższy przykład demonstruje problem, z którym można spotkać podczas korzystania z tej składni. [Chroniony e-mail] ~ $ Touch atxt.txt [Chroniony e-mail] ~ $ Zmień nazwę "s / txt / problem /" atxt.txt [Chroniony e-mail] ~ $ LS ABC Allfiles.txt Backup CLLFILES.TXT TEMP.TXT Tennis.txt abc.conf aploblem.txt Bllfiles.txt Scratch Tennis2.txt [Chroniony e-mail] ~ $

Podczas rozpatrzenia w rozważaniu polecenia należy przeprowadzić wymianę wyjątkowo pierwszego wpisu poszukiwanego ciągu.

Globalna wymiana

Składnia używana w poprzednim przykładzie można opisać w następujący sposób: S / Wyrażenie regularne / Ciąg do wymiany /. Ten opis jest prosty i oczywisty, ponieważ musisz tylko umieścić wyrażenie regularne między dwoma pierwszymi ukośnikami a wierszem, aby zastąpić między dwoma śladami.

W poniższym przykładzie ta składnia jest nieznacznie rozszerzona ze względu na dodanie modyfikatora. [Chroniony e-mail] ~ $ Rename -n "s / txt / txt / g" atxt.txt atxt.txt przemianowany jako atxt.txt [Chroniony e-mail] ~ $

Teraz stosowany składnia można określić jako ekspresję / regularny / łańcuch dla wymiany / g, gdzie modyfikator S jest operacją wymiany (przełącznikiem), a modyfikator G informuje o konieczności wdrożenia globalna wymiana (Światowy).

Należy pamiętać, że w tym przykładzie -n parametr był używany do wyświetlania informacji o wykonanej operacji (zamiast wykonać samą operację, która polega na bezpośrednim wyremontowaniu pliku).

Wymiana bez rejestracji

Innym modyfikatorem, który może być przydatny jest modyfikator I. Poniższy przykład przedstawia metodę wymiany ciągu do innej linii bez rejestracji rejestru. [Chroniony e-mail]: ~ ~ / Pliki $ ls file1.text file2.text file3.txt [Chroniony e-mail]: ~ ~ / Pliki $ zmień nazwę "s / .text / .txt / i" * [Chroniony e-mail]: ~ / Pliki $ ls file1.txt file2.txt file3.txt [Chroniony e-mail]: ~ / Pliki $

Zmiana rozszerzeń

Interfejs zespołu linux Strings. Nie ma pojęcia o rozszerzeniach plików podobnych do MS-DOS ma zastosowanie w systemie operacyjnym, ale wielu użytkowników i aplikacjach z interfejsem graficznym używają ich.

Ta sekcja zapewnia przykład korzystania z narzędzia Zmień nazwę, aby zmienić wyłącznie rozszerzenia plików. Przykład używa symbolu dolara, aby wskazać, że punkt odniesienia dla wymiany jest końcem nazwy pliku. [Chroniony e-mail] ~ $ LS * .txt allfiles.txt bllfiles.txt cllfiles.txt Naprawdę.txt.txt temp.txt tennis.txt [Chroniony e-mail] ~ $ Zmień nazwy "s / .txt $ /. Txt /" * .txt [Chroniony e-mail] ~ $ LS * .txt allfiles.txt bllfiles.txt cllfiles.txt Naprawdę.txt.txt temp.txt tennis.txt [Chroniony e-mail] ~ $

Zauważ, że symbol dolara w wyrażeniu regularnym wskazuje koniec linii. Bez symbolu dolara wykonanie tego polecenia powinno zostać zakończone w momencie przetwarzania nazwy pliku naprawdę.txt.txt.

SED Utility.

Edytor strumienia danych.

Edytor strumienia danych (edytor strumieniowych) lub, dla zwięzłości, narzędzie SED wykorzystuje wyrażenia regularne do modyfikowania strumienia danych.

W tym przykładzie narzędzie SED służy do zastąpienia ciągu. Echo poniedziałek |. SED "S / MONON / SEC /" Wtorek

Slash można zastąpić kilkoma innymi postaciami, które mogą być wygodniejsze i lepsze czytelność zespołu w niektórych przypadkach. Echo poniedziałek |. SED "S: poniedziałek: Drugi:" Wtorek Echo poniedziałek | Sed "s_- region_vtor_" wtorek echo poniedziałek | Sed "s | poniedziałek | szczur |" wtorek

Edytor interaktywny

Pomimo faktu, że Utility SED jest przeznaczony do obsługi strumieni danych, może być również używany do interaktywnego przetwarzania plików. [Chroniony e-mail]: ~ / Files $ echo poniedziałek\u003e Dzisiaj [Chroniony e-mail]: ~ ~ / Files $ cat dzisiaj poniedziałek [Chroniony e-mail]: ~ ~ / Pliki $ sed -i "s / poniedziałek / dev /" Dzisiaj [Chroniony e-mail]: ~ ~ / Files $ cat dzisiaj we wtorek

Symbol Ampersand może być używany do odnoszenia się do żądanego (i znalezionego) ciągu.

W tym przykładzie, Ampersand jest używany do podwojenia liczby znalezionych linii. Echo poniedziałek |. Sed "s / monda / && /" poniedziałek echo poniedziałek | Sed "s / Nik / && /" poniedziałek

Okrągłe wsporniki służą do grupowania części regularnego wyrażenia, które można następnie zainstalować łącza.

Rozważ następujący przykład: [Chroniony e-mail]: ~ $ Echo Niedziela | Sed "s _ (słońce) _ 1ny_" Sunnyy [Chroniony e-mail]: ~ $ Echo Niedziela | Sed "s _ (słońce) _ 1ny \\ 1" Słoneczna niedziela

Wskaż oznaczenie dowolnego symbolu

W wyrażeniu regularnym, symbol prosty punkt może wyznaczyć dowolną postać. [Chroniony e-mail]: ~ $ Echo 2014-04-01 | sed "s /....-..-..-..- yyy-mm-dd /" yyyy-mm-dd [Chroniony e-mail]: ~ $ Echo ABCD-EF-GH | sed "s /....-..-..-..- yyy-mm-dd /" yyyy-mm-dd

W przypadku więcej niż jednej pary okrągłych wsporników odniesienie do każdego z nich można przeprowadzić za pomocą kolejnych wartości numerycznych. [Chroniony e-mail]: ~ $ Echo 2014-04-01 | Sed "s / (....) (..) - (..) / 1+ 2+ 3 /" 2014 + 04 + 01 [Chroniony e-mail]: ~ $ Echo 2014-04-01 | Sed "s / (...) (..) (..) / 3: 2: 1 /" 01: 04: 2014

Ta funkcja nazywa się grupowaniem.

Przestrzeń

Sekwencja symbolu może być używana do odnoszenia się do takim symbolu jako symbol przestrzeni lub karty.

Ten przykład zapewnia globalne sekwencje sekwencji symboli gapów (s), które są zastępowane przez 1 statek kosmiczny. [Chroniony e-mail]: ~ $ Echo -e "Dzisiaj Tytuł TD" Dzisiaj jest ciepły dzień [Chroniony e-mail]: ~ $ Echo -e "Dzisiaj Handel TDN" | sed "s_ _g" dziś ciepły dzień

Opcjonalne wpisy

Symbol znaku zapytania wskazuje, że poprzedni symbol jest opcjonalny.

W poniższym przykładzie sekwencja trzech znaków poszukuje, a trzecia postać o jest opcjonalna. [Chroniony e-mail]: ~ $ Cat List2 ll lol lool Loool [Chroniony e-mail]: ~ $ Grep -e "OOO?" List2 Lool Loool. [Chroniony e-mail]: ~ $ CAT List2 | Sed "s / ooo" / a / "ll lol lal lal

Dokładnie n powtórzeń

Możesz określić dokładną liczbę powtórzeń poprzedniego symbolu.

Ten przykład szuka wierszy z dokładnie trzema symbolami O. [Chroniony e-mail]: ~ $ Cat List2 ll lol lool Loool [Chroniony e-mail]: ~ $ Grep -e "O (3)" List2 Loool [Chroniony e-mail]: ~ $ CAT List2 | Sed "s / o \\ (3) / a /" ll lol lool lal [Chroniony e-mail]:~$

Od N do M Powtórzy

W tym przykładzie wyraźnie wskazujemy, że symbol musi być powtarzany z minimum (2) do maksimum (3) liczby razy. [Chroniony e-mail]: ~ $ Cat List2 ll lol lool Loool [Chroniony e-mail]: ~ $ Grep -e "O (2.3)" List2 Lool Loool [Chroniony e-mail]: ~ $ Grep "O (2.3)" List2 Lool Loool [Chroniony e-mail]: ~ $ CAT List2 | Sed "s / o (2.3) / a /" ll lol lal lal [Chroniony e-mail]:~$

Historia skorupkowania poleceń bash

Powłoka poleceń bash może również zinterpretować pewne wyrażenia regularne.

Ten przykład pokazuje technikę manipulacyjną z wykrzyknikiem jako część maski wyszukiwania w historii skorupki komend Bash. [Chroniony e-mail]: ~ $ MKDir Hist [Chroniony e-mail]: ~ $ CD Hist / [Chroniony e-mail]: ~ / Hist $ Touch file1 file2 file3 [Chroniony e-mail]: ~ / Hist $ LS -L file1 -RW-r - R-- 1 Paul Paul 0 kwietnia 15 22:07 File1 [Chroniony e-mail]: ~ / Hist $! L LS -L file1 -RW-r - R-- 1 Paul Paul 0 kwietnia 15 22:07 File1 [Chroniony e-mail]: ~ ~ / Hist $! L: S / 1/3 LS -L file3 -RW-r - R- 1 Paul Paul 0 kwietnia 15 22:07 plik3 [Chroniony e-mail]: ~ / Hist $

Ta technika działa również w przypadku korzystania z numerów podczas odczytu historii polecenia powłoki komend Bash. [Chroniony e-mail]: ~ / Hist $ Historia 6 2089 MKDir HIST 2090 CD HIST / 2091 Dotknij pliku1 file2 file3 2092 LS -L file1 2093 LS -L file3 2094 Historia 6 [Chroniony e-mail]: ~ / Hist $! 2092 LS -L file1 -RW-r - R-- 1 Paul Paul 0 kwietnia 15 22:07 File1 [Chroniony e-mail]: ~ ~ / Hist $! 2092: S / 1/2 LS -L file2 -RW-r - R-- 1 Paul Paul 0 kwietnia 15 22:07 plik2 [Chroniony e-mail]: ~ / Hist $

Aby w pełni przetwarzać teksty w skryptach bash za pomocą sed i awk, jest po prostu konieczne do radzenia sobie z wyrażeniami regularnymi. Wdrożenie tego użytecznego narzędzia można znaleźć dosłownie wszędzie i chociaż wszystkie wyrażenia regularne są używane, w oparciu o te same pomysły, praca z nimi ma pewne cechy w różnych środowiskach. Tutaj będziemy rozmawiać o wyrażeniach regularnych, które nadają się do stosowania w scenariuszach. wiersz poleceń Linux.

Ten materiał jest pomyślany jako wprowadzenie do wyrażeń regularnych, zaprojektowany dla tych, którzy mogą absolutnie nie wiedzieć, co to jest. Dlatego zacznij od samego początku.

Jakie są wyrażenia regularne

Dla wielu, kiedy najpierw widzą wyrażenia regularne, pomysł natychmiast pojawia się, że nie ma sensu djazdy postaci. Ale to oczywiście jest daleko. Spójrz na przykład na ten regularny wyraz


Naszym zdaniem nawet absolutna nowicjusz natychmiast zrozumie, jak to działa i dlaczego jest to konieczne :) Jeśli nie rozumiesz, wystarczy przeczytać dalej i wszystko wpadnie na miejsce.
Wyrażenie regularne jest szablonem, który wykorzystuje programy, takie jak SED lub Teksty Filtr AWK. W szablonach konwencjonalne postacie ASCII reprezentujące siebie, a tzw. Metasimlists, którzy odgrywają szczególną rolę, na przykład, co pozwala odnieść się do niektórych grup znaków.

Rodzaje wyrażeń regularnych

Wdrożenie wyrażeń regularnych w różnych środowiskach, na przykład w językach programowania, takich jak Java, Perl i Python, w narzędziach Linux, takich jak SED, AK i GREP, mają pewne funkcje. Funkcje te zależą od tak zwanych silników przetwarzania silnika, które są angażowane w interpretację szablonów.
Linux ma dwa silniki regularne:
  • Silnik obsługujący standardowy standardowy wyrażenie regularne POSIX (BRE).
  • Silnik obsługujący standardowy standardowy wyrażenie regularne POSIX (ER).
Większość mediów Linux odpowiada przynajmniej standardowym Posix BRE, ale niektóre narzędzia (wśród nich - sed) rozumieć tylko określony podzbiór standardu BRE. Jednym z przyczyn takiego ograniczenia jest pragnienie dokonania takich mediów tak szybko, jak to możliwe w przetwarzaniu tekstu.

Standard Posix Ere jest często wdrażany w językach programowania. Pozwala na wykorzystanie dużej liczby funduszy podczas rozwijania wyrażeń regularnych. Na przykład może to być sekwencje znaków specjalnych dla często używanych wzorów, takich jak wyszukiwanie w tekście. oddziel słowa lub zestawy cyfr. Awk wspiera standard Ere.

Istnieje wiele sposobów opracowania wyrażeń regularnych w zależności od opinii programisty, aw funkcji silnika, który jest przez nich tworzony. Nie jest łatwo pisać uniwersalne wyrażenia regularne, które mogą zrozumieć każdy silnik. Dlatego skupimy się na najczęściej wykorzystywanych wyrażeń regularnych i rozważyć cechy ich wdrożenia dla sed i awk.

Wyrażenia regularne POSIX BRE

Być może najprostszy szablon BRE jest wyrażeniem regularnym, aby wyszukać dokładną sekwencję symboli w tekście. Oto, jak wygląda wyszukiwanie ciągu w SED i awk:

$ Echo "To jest test" | Sed -n "/ test / p" $ echo "To jest test" | Awk "/ test / (wydrukuj 0 $)"

Szukaj tekst według szablonu


Szukaj tekstu według szablonu w awk

Można zauważyć, że wyszukiwanie określonego szablonu jest wykonywane bez uwzględnienia dokładnej lokalizacji tekstu w ciągu. Ponadto liczba zdarzeń nie ma znaczenia. Po zakończeniu wyrażenia regularnego znajduje określony tekst w dowolnym miejscu ciąg, ciąg jest uważany za odpowiedni i przesyłany do dalszego przetwarzania.

Praca z wyrażeniami regularnymi należy wziąć pod uwagę, że są one wrażliwe na rejestr znaków:

$ Echo "To jest test" | Awk "/ test / (wydrukuj 0 $)" $ echo "To jest test" | Awk "/ test / (wydrukuj 0 $)"

Wyrażenia regularne są wrażliwe na rejestrację

Pierwsza regularna ekspresja zbiegów zbiegów nie znalazła, ponieważ słowo "test", zaczynając od wielkiej litery, nie występuje w tekście. Drugi, skonfigurowany do wyszukiwania słowa napisane przez wielkie litery, znalazłem odpowiedni ciąg w strumieniu.

W wyrażeniach regularnych możliwe jest nie tylko litery, ale także przestrzenie i liczby:

$ Echo "Jest to ponownie test 2" | Awk "/ test 2 / (Drukuj 0 $)"

Wyszukaj fragment tekstu zawierający spacje i liczby

Przestrzenie są postrzegane przez silnik wyrażeń regularnych jako zwykłych postaci.

Specjalne symbole

Podczas korzystania z różnych symboli w wyrażeniach regularnych niektóre funkcje należy wziąć pod uwagę. Istnieją więc pewne specjalne symbole lub metacharaktery, których w szablonie wymaga szczególnego podejścia. Tutaj są:

.*^${}\+?|()
Jeśli jeden z nich jest potrzebny w szablonie, będzie musiał być ekranowany za pomocą odwrotnej warkocza (odwrócona slash) -.

Na przykład, jeśli tekst musisz znaleźć znak dolara, należy go włączyć w szablonie, po symbolu przesiewowym. Powiedz, znajduje się plik MyFile z takim tekstem:

W kieszeni jest 10 dolarów
Znak dolara można wykryć za pomocą takiego szablonu:

$ Awk "/ $ / (Drukuj 0 $)" Myfile

Użyj w specjalnym szablonie symbolu

Ponadto linia odwrócona jest również specjalnym symbolem, więc jeśli chcesz go użyć w szablonie, musi on być również ekranowany. Wygląda na dwa slash, idąc do siebie:

$ Echo "jest znakiem specjalnym" | Awk "/ \\ / (Drukuj 0 $)"

Osłona do odwrotnej slash.

Chociaż bezpośrednie ukośnik nie jest zawarty na liście znaków specjalnych powyżej, próba korzystania z nich w wyrażeniu regularnym zapisanym dla SED lub awk spowoduje błąd:

$ Echo "3/2" | awk "/// druk 0 $)"

Nieprawidłowe użycie bezpośredniego ukośnika w szablonie

W razie potrzeby powinien być również ekranowany:

$ Echo "3/2" | awk "// (wydrukuj 0 $)"

Osłona bezpośrednie ukośnik

Symbole kotwiczenia

Istnieją dwa znaki specjalne, aby związać szablon na początku lub na końcu ciągu tekstu. Symbol "Cover" - ^ umożliwia opisanie sekwencji znaków, które są na początku ciągów tekstowych. Jeśli pożądany wzór jest w innym miejscu ciągu, wyrażenie regularne nie odpowiada na niego. Wygląda na ten symbol taki jak:

$ Echo "Witamy na stronie LikeGeeks" | Awk "/ ^ likegeeks / (Drukuj 0 $)" $ Echo "LikeGeeks Strona internetowa" | Awk "/ ^ lasgeeks / (wydrukuj 0 $)"

Szablon wyszukiwania na początku linii

Symbol ^ jest przeznaczony do wyszukiwania szablonu na początku linii, podczas gdy rejestr znaków jest również brany pod uwagę. Zobaczmy, jak wpłynie to na przetwarzanie plik tekstowy:

$ Awk "/ ^ to / (wydrukuj $ 0)" Myfile


Szablon wyszukiwania na początku linii w tekście z pliku

Podczas korzystania z sed, jeśli umieścisz pokrywę w dowolnym miejscu wewnątrz szablonu, zostanie on postrzegany jako inny konwencjonalny symbol:

$ Echo "To ^ jest testem" | Sed -n "/ s ^ / p"

Okładka, która nie jest na początku szablonu w SED

W awk, gdy używasz tego samego szablonu, ta postać powinna być ekranowana:

$ Echo "To ^ jest testem" | Awk "/ s ^ / (Drukuj 0 $)"

Okładka, która nie jest na początku szablonu w awk

Wyszukiwanie fragmentów tekstowych wymyśliliśmy na początku linii. Co jeśli chcesz znaleźć coś znajduje się na końcu linii?

Pomoże nam to znak dolara - $, który jest symbolem końcowym snurem kotwicy:

$ Echo "To jest test" | Awk "/ test $ / (drukować 0 $)"

Wyszukiwanie tekstu na końcu ciągu

W tym samym szablonie możesz użyć obu symboli kotwicy. Wykonamy przetwarzanie pliku MyFile, którego zawartość przedstawiono na poniższym rysunku, przy użyciu takiego wyrażenia regularnego:

$ Awk "/ ^ to test $ / (Drukuj $ 0)" MyFile


Szablon, w którym używane są specjalne symbole startowe i końcowe

Jak widać, szablon zareagowano tylko na ciąg w pełni odpowiedni określona sekwencja znaki i ich lokalizacja.

Oto jak, używając symboli kotwicy, filtr puste linie:

$ Awk "! / ^ $ / (Drukuj $ 0)" Myfile
W tym szablonie używał symbolu zaprzeczania, wykrzyknikiem -! . Dzięki zastosowaniu takiego szablonu znajduje się wyszukiwanie linii, które nie zawierają niczego między początkiem a końcem linii, a wykrzyknik Wyświetlane są tylko linie, które nie odpowiadają temu szablonie.

Symbol "punkt"

Punkt służy do wyszukiwania dowolnego symbolu, z wyjątkiem symbolu tłumaczenia rzędu. Dajmy taki regularny plik MyFile, którego zawartość przedstawiono poniżej:

$ Awk "/.st/(grint 0 $)" Myfile


Korzystanie z punktu w wyrażeniach regularnych

Jak widać zgodnie z wyświetlonymi danymi, szablon odpowiada tylko pierwszych dwóch linii z pliku, ponieważ zawierają sekwencję znaków "St", udawansowały innym symbolem, podczas gdy trzeci wiersz odpowiedniej sekwencji nie zawiera , a po czwartym jest, ale jest na samym początku linii.

Zajęcia symboli

Punkt odpowiada dowolnym pojedynczym symbolem, ale co, jeśli potrzebujesz bardziej elastycznie ograniczyć zestaw pożądanych znaków? W takiej sytuacji możesz użyć klas znaków.

Dzięki temu podejściu możesz zorganizować wyszukiwanie dowolnego znaku z określonego zestawu. Nawiasy kwadratowe służą do opisania klasy znaków -:

$ Awk "/ th / (Drukuj 0 $)" Myfile


Opis klasy znaków w regularnych warunkach

Tutaj szukamy sekwencji znaków "TH", przed którym jest symbol "O" lub symbol "I".

Klasy okazują się bardzo gościnne, jeśli wyszukiwanie słów, które mogą rozpocząć zarówno z kapitałowych, jak i małych liter:

$ Echo "To jest test" | Awk "/ jego jest testem / (drukować 0 $)" $ echo "To jest test" | Awk "/ jego jest testem / (drukować $ 0)"

Znalezienie słów, które mogą zacząć od małej litery lub wielkiej litery

Zajęcia znaków nie ograniczają się do liter. Tutaj możesz użyć innych znaków. Nie można tego powiedzieć, w jakiej sytuacji wymagają zajęć sytuacji - wszystko zależy od rozwiązania zadania.

Zaprzeczenie klas symboli

Zajęcia znaków można również wykorzystać do rozwiązania zadania odwrotnie opisane powyżej. Mianowicie, zamiast znajdować bohaterów zawartych w klasie, możesz zorganizować wyszukiwanie wszystkiego, co nie jest zawarte w klasie. W celu osiągnięcia takiego zachowania wyrażenia regularnego, przed listą znaków klasy musisz umieścić znak ^. To wygląda tak:

$ Awk "/ [^ oi] th / (drukowanie $ 0)" Myfile


Wyszukaj symbole nie zawarte w klasie

W tym przypadku zostaną znalezione sekwencje postaci "TH", zanim nie ma "O", ani "ja".

Pasma symboli

W zajęciach symbolicznych możesz opisać zakresy znaków za pomocą Dash:

$ Awk "/ st / (wydrukuj 0 $)" Myfile


Opis zakresu symboli w klasie symbolicznej

W tym przykładzie wyrażenie regularne reaguje na sekwencję symboli "St", przed którymi znajduje się każdy symbol, w kolejności alfabetycznej, między znakami "E" i "P".

Zakresy można utworzyć z numerów:

$ Echo "123" | awk "//" $ echo "12a" | awk "//"

Wyrażenie regularne do wyszukiwania trzech liczb

Klasa symbolu może zawierać kilka zakresów:

$ Awk "/ st / (wydrukuj 0 $)" Myfile


Klasa symbol składająca się z kilku zakresów

To wyrażenie regularne znajdzie wszystkie sekwencje "ST", przed którymi są symbole z zespołów A-F i M-Z.

Specjalne zajęcia symboli

BRE ma klasy specjalne, które można wykorzystać podczas pisania wyrażeń regularnych:
  • [[: Alfa:]] - odpowiada dowolnym symbolem alfabetycznym nagranym w górnym lub niższym rejestrze.
  • [[: Alnum:]] - odpowiada dowolnym symbolem alfanumerycznym, a mianowicie symbole w zakresie 0-9, A-Z, A-Z.
  • [[: Puste:]] - Odpowiada lukę i karcie karty.
  • [[: Cyfra:]] - Każdy cyfrowy symbol od 0 do 9.
  • [[: Górna:]] - znaki alfabetyczne w wielkiej litery - A-Z.
  • [[: Dolna:]] - znaki alfabetyczne w małych literach - A-Z.
  • [[: Drukuj:]] - odpowiada dowolnym wydrukowanym symbolem.
  • [[: Upa:]] - odpowiada znakom interpunkcyjnym.
  • [[: Space:]] - Blind Postacie, w szczególności - Space, Tab Sign, Symbols NL, FF, VT, Kr.
Używaj specjalnych zajęć w takich szablonach:

$ Echo "abc" | Awk "/ [[: alfa:]] / (Drukuj 0 $)" $ Echo "ABC" | Awk "/ [[: cyfra:]] / (Drukuj 0 $ 0)" $ Echo "ABC123" | Awk "/ [[: cyfra:]] / (Drukuj 0 $)"


Specjalne zajęcia symboli w wyrażeniach regularnych

Symbol "gwiazda"

Jeśli w szablonie po symbolu umieść gwiazdę, to oznacza, że \u200b\u200bwyrażenie regularne będzie działać, jeśli symbol pojawi się w linii dowolną liczbę razy - w tym sytuację, gdy brakuje znaku w linii.

$ Echo "test" | Awk "/ tes * t / (wydrukuj 0 $ 0)" $ echo "Tesst" | Awk "/ tes * t / (drukowanie $ 0)"


Używanie symbolu * w wyrażeniach regularnych

Ten symbol szablonu jest zwykle używany do pracy ze słowami, w których literuje lub słowa umożliwiające różne opcje pisowni:

$ Echo "Lubię zielony kolor" | Awk "/ colou * r / (Drukuj $ 0)" $ echo "Lubię zielony kolor" | Awk "/ colou * r / (Drukuj $ 0)"

Wyszukaj słowa o różnych opcjach pisania

W tym przykładzie, ta sama ekspresja regularna reaguje na słowo "kolor" i słowo "kolor". Tak dzięki temu symbol "U", po którym stoi gwiazdy, mogą być nieobecne lub występujące kilka razy z rzędu.

Kolejną przydatną okazją wynikającą z funkcji symbolu gwiazd jest połączenie go z punktem. Taka kombinacja umożliwia regularne wyrażenie odpowiadanie na dowolną liczbę jakichkolwiek znaków:

$ Awk "/this.*test/(print 0 $)" Myfile


Szablon reaguje na dowolną liczbę znaków

W tym przypadku, bez względu na to, ile znaków jest między słowami "to" i "test".

Gwiazdy mogą być używane z zajęć symboli:

$ Echo "st" | Awk "/ s * t / (wydrukuj 0 $)" $ echo "sob" | Awk "/ s * t / (Drukuj 0 $)" $ Echo "Set" | Awk "/ s * t / (drukować 0 $)"


Używanie gwiazd z symbolami

We wszystkich trzech przykładach wyrażenie regularne jest wyzwalane, ponieważ gwiazdy po klasie znaków oznacza, że \u200b\u200bjeśli pojawi się dowolna liczba znaków "A" lub "E", a jeśli nie można go znaleźć, ciąg pasuje do określonego szablonu.

Regularne wyrażenia Posix Ere

Szablony pOSIX Standard. Co obsługuje niektóre narzędzia Linux mogą zawierać dodatkowe znaki. Jak już wspomniano, awk wspiera ten standard, ale sed nie jest.

Tutaj przyjrzymy się najczęściej używanymi symbolami, które będą przydatne przy tworzeniu własnych wyrażeń regularnych.

▍Shisant znak

Znak zapytania wskazuje, że poprzedni symbol może się spotkać w tekście raz lub nie spotykać się w ogóle. Ten symbol jest jednym z metasimwoli powtórzeń. Oto kilka przykładów:

$ Echo "tet" | Awk "/ tes? T / (drukować 0 $)" Test $ echo "| Awk "/ tes? T / (drukowanie $ 0)" $ echo "Tesst" | Awk "/ tes? T / (drukowanie $ 0)"


Znak zapytania w wyrażeniach regularnych

Jak widać, w trzecim przypadku, litera "S" spotyka się dwa razy, więc słowo "Test" nie odpowiada regularnym wyrażeniu.

Znak zapytania może być używany z zajęć symboli:

$ Echo "TST" | Awk "/ t? St / (drukować 0 $)" Test "$ echo" | Awk "/ t? St / (drukować $ 0)" $ echo "smak" | Awk "/ t? St / (Drukuj 0 $)" $ Echo "Taest" | Awk "/ t? St / (drukować $ 0)" $ echo "teest" | Awk "/ t? St / (wydrukuj 0 $)


Znak zapytania i zajęcia symbol

Jeśli nie ma już znaków z klasy z rzędu, czy jeden z nich występuje raz, wyrażenie regularne jest wyzwolone, ale jest to konieczne, aby wyświetlić dwa znaki, a system nie znajduje już w tekście pasującego do tekstu.

▍simol "plus"

Symbol plus w szablonie wskazuje, że wyrażenie regularne wykryje żądany, jeśli poprzedni symbol spotka się w tekście jeden lub więcej razy. Jednocześnie nie będzie takiego projektu na brak symbolu:

$ Echo "test" | Awk "/ te + st / (wydrukuj 0 $)" $ echo "teest" | Awk "/ te + st / (wydrukuj 0 $)" $ echo "TST" | Awk "/ te + st / (wydrukuj 0 $)"


Symbol "plus" w wyrażeniach regularnych

W tym przykładzie, jeśli w tym słowie nie ma symbolu "e", silnik wyrażeń regularnych nie znajduje szablon w tekście pasującego tekstu. Symbol prac "Plus" i z klasami symboli - jest podobny do naklejki i znaku zapytania:

$ Echo "TST" | Awk "/ t + st / (Drukuj 0 $)" Test $ Echo "| Awk "/ t + st / (wydrukować $ 0)" $ echo "TEST" | Awk "/ t + st / (Drukuj 0 $)" $ Echo "Teeast" | Awk "/ t + st / (drukować 0 $)"


Zajęty znak i symbol

W tym przypadku, jeśli istnieje jakakolwiek znak z klasy w linii, tekst zostanie wykryty przez odpowiedni wzór.

▍Figure nawiasy

Obudziane wsporniki, które można wykorzystać w szablonach Ere, są podobne do symboli omówionych powyżej, ale umożliwiają dokładniejsze ustawienie niezbędnej liczby wpisów symbolu wcześniej. Możesz określić ograniczenie w dwóch formatach:
  • n to numer, który określa dokładną liczbę żądanych wpisów
  • n, m - dwie liczby, które są interpretowane w następujący sposób: "przynajmniej n razy, ale nie więcej niż M."
Oto przykłady pierwszej opcji:

$ Echo "TST" | Awk "/ te (1) st / (drukować 0 $)" Test $ echo "| Awk "/ te (1) st / (drukowanie $ 0)"

Obuczł wsporniki w szablonach, szukaj dokładnej liczby zdarzeń

W starych wersjach awk konieczne było użycie interwału linii poleceń, aby program rozpoznać interwały w wyrażeniach regularnych, ale nie jest konieczne wykonywanie tego w nowych wersjach.

$ Echo "TST" | Awk "/ te (1,2) ST / (Drukuj 0 USD)" Test $ Echo "| Awk "/ te (1,2) st / (drukować 0 $)" $ echo "teest" | Awk "/ te (1,2) st / (drukować 0 $)" $ echo "teest" | Awk "/ te (1,2) st / (drukowanie $ 0)"


Interwał Macoba

W tym przykładzie symbol "E" powinien spełniać w ciągu 1 lub 2 razy, a następnie wyrażenie regularne odpowie na tekst.

Obuczane wsporniki mogą być używane z zajęć symboli. Tutaj są już znane z zasadami:

$ Echo "TST" | Awk "/ t (1,2) st / (drukować $ 0)" Test $ echo "| Awk "/ t (1,2) st / (drukować 0 $)" $ echo "teest" | Awk "/ t (1,2) ST / (Drukuj 0 $ 0)" $ Echo "Teest" | Awk "/ t (1,2) st / (drukować 0 $)


Duże wsporniki i zajęcia symbol

Szablon odpowie na tekst, jeśli spełnia symbol "A" lub symbol "E".

▍Mimvivo Logiczne "lub"

Symbol | - cecha pionowa, oznacza w wyrażeniach regularnych logicznych "lub". Przetwarzanie wyrażenia regularnego zawierającego kilka fragmentów oddzielonych przez takiego znaku, silnik rozważy analizowany tekst odpowiedni w przypadku, gdy będzie odpowiadać dowolnym z fragmentów. Oto przykład:

$ Echo "To jest test" | Awk "/ test | egzamin / (drukować 0 $)" $ echo "To jest egzamin" | Awk "/ test | egzamin / (drukować 0 $)" $ echo "To jest coś innego" | Awk "/ test | egzamin / (drukować $ 0)"


Logiczne "lub" w wyrażeniach regularnych

W tym przykładzie, wyrażenie regularne jest skonfigurowane do wyszukiwania w tekście słów "test" lub "egzamin". Należy pamiętać, że między fragmentami szablonów i symbolem udostępniania | Nie powinno być żadnych luek.

Fragmenty wyrażeń regularnych można pogrupować za pomocą okrągłego wsporników. Jeśli pewna sekwencja znaków zostanie zgrupowana, zostanie on postrzegany przez system jako normalny symbol. To jest na przykład, możliwe będzie zastosowanie metacząców powtórzeń. Oto, jak wygląda:

$ Echo "jak" | Awk "/ jak (geek)? / (Drukuj 0 $)" $ Echo "LikeGeeks" | Awk "/ jak (geeks)? / (Drukuj 0 $)"


Grupowanie fragmentów wyrażeń regularnych

W takich przykładach słowo "geeks" jest zamknięty w nawiasach okrągłych, po tym wzornictwie znajduje się znak zapytania. Przypomnijmy, że znak zapytania oznacza powtarzanie "0 lub 1, w rezultacie, wyrażenie regularne reaguje na ciąg" jak ", a na ciągach LOVEGEKS.

Praktyczne przykłady

Po zdemontowaniu fundamentów wyrażeń regularnych, nadszedł czas, aby coś z nimi zrobić.

▍ Liczba plików

Napisz skrypt bash, który liczy pliki w katalogach, które są rejestrowane zmienne środowisko Ścieżka. Aby to zrobić, musisz rozpocząć, utworzyć listę sposobów do katalogów. Zróbmy to z sed, zastępując je dwukropek na przestrzeni:

$ Echo $ path | Sed "s /: / / g"
Polecenie zastępcze obsługuje wyrażenia regularne jako szablony do wyszukiwania tekstu. W tym przypadku wszystko jest niezwykle proste, szukamy symbolu dwukropkowego, ale nikt nie przeszkadza sobie tutaj korzystać, a coś innego - wszystko zależy od konkretnego zadania.
Teraz musisz przejść przez listę otrzymaną w pętli i wykonaj liczbę plików działania niezbędnych do obliczeń. Ogólny schemat skryptu będzie taki:

MyPath \u003d $ (Echo $ path | sed "s /: / / g") do katalogu w $ Mypath
Teraz napisz pełny tekst skryptu za pomocą polecenia LS, aby uzyskać informacje o liczbie plików w każdym z katalogu:

#! / BIN / BASH MYPATH \u003d $ (ECHO $ \u200b\u200bPATH | SED "S /: / / G") Liczba \u003d 0 do katalogu w $ Mypath Do sprawdź \u003d $ (LS $ Directory) dla pozycji w $ Check LIT \u003d $ [$ Count + 1] Dokonane Echo "$ Directory - $ Count" Count \u003d 0 gotowe
Po uruchomieniu skryptu może okazać się, że niektóre katalogi ze ścieżki nie istnieją jednak, jednak nie uniemożliwia mu obliczania plików w istniejących dyrektorach.


Liczenie plików

Główną wartością tego przykładu jest to, że przy użyciu tego samego podejścia można rozwiązać znacznie bardziej złożone zadania. Co dokładnie - zależy od twoich potrzeb.

▍ Sprawdź adresy e-mail

Istnieją strony internetowe z ogromnymi kolekcjami wyrażeń regularnych, które umożliwiają sprawdzanie adresów e-mail, numery telefonów i tak dalej. Jednak jedna rzecz jest gotowa i zupełnie inny - stwórz coś samego. Dlatego napisz wyrażenie regularne, aby sprawdzić adresy e-mail. Zacznijmy od analizy danych źródłowych. Tutaj na przykład określony adres:

[Chroniony e-mail]
Nazwa użytkownika, nazwa użytkownika, może składać się z alfanumerycznych i innych znaków. Mianowicie, jest to kropka, kreska, symbol adhezji, znak plus. Za nazwą użytkownika powinien podpisać @.

Uzbrojony w te wiedzę, zacznijmy montować wyrażenie regularne z lewej części, która służy do sprawdzania nazwy użytkownika. To właśnie zrobiliśmy:

^(+)@
To wyrażenie regularne można znaleźć w następujący sposób: "Na początku linii, musi istnieć co najmniej jeden znak z tych, które są w grupie określonej w nawiasach kwadratowych, a po tym, jak powinien iść.

Teraz - nazwa nazwy hosta - nazwa hosta. Te same zasady mają zastosowanie tutaj, jak dla nazwy użytkownika, więc szablon będzie wyglądał tak:

(+)
Nazwa domeny najwyższy poziom OBEYS Specjalne zasady. Może być tylko znaki alfabetyczne, które powinny być co najmniej dwa (na przykład, takie domeny zwykle zawierają kod kraju) i nie więcej niż pięć. Wszystko to oznacza, że \u200b\u200bszablon do sprawdzania ostatniej części adresu będzie:

\.({2,5})$
Możesz to przeczytać: "Musisz najpierw być punktem, a następnie - od 2 do 5 znaków alfabetycznych, a następnie kończy się linia".

Przygotuj szablony do poszczególnych części wyrażenia regularnego, zbieramy je razem:

^(+)@(+)\.({2,5})$
Teraz pozostaje tylko do przetestowania tego, co się stało:

$ echo " [Chroniony e-mail]"| awk" / ^ (+) @ (+). ((2,5) $$ / (Drukuj 0 $) "$ echo" [Chroniony e-mail]"| awk" / ^ (+) @ (+). ((2,5) $ 0) "/ (Drukuj 0 $)"


Sprawdź adres e-mail za pomocą wyrażeń regularnych

Fakt, że przesyłany tekst Tekst jest wyświetlany na ekranie oznacza, że \u200b\u200bsystem rozpoznał w nim adres e-mail.

Wyniki

Jeśli wyrażenie regularne do sprawdzania adresów e-mail, które spotkały się na samym początku artykułu, wydawało się to całkowicie niezrozumiały, miejmy nadzieję, że teraz nie wygląda jak bezsensowny zestaw znaków. Jeśli to prawda - oznacza to, że ten materiał wypełnił swoje miejsce docelowe. W rzeczywistości, wyrażenia regularne są tematem, który może być zaangażowany we wszystkie życie, ale nawet mała rzecz, którą demontowaliśmy, jest już w stanie pomóc Ci w pisaniu skryptów, które są całkiem zaawansowane teksty.

W tej serii materiałów zazwyczaj pokazaliśmy bardzo proste przykłady. Skrypty bash, które składały się dosłownie z kilku linii. Następnym razem rozważymy coś bardziej na dużą skalę.

Drodzy Czytelnicy! Czy używasz wyrażeń regularnych podczas przetwarzania tekstów w skryptach wiersza poleceń?

Dobry czas, goście!

W dzisiejszym artykule chcę dotknąć takiego ogromnego tematu Wyrażenia regularne. Myślę, że wszyscy wiedzą, że temat regulatorów (tak wyrażenia regularne są nazywane w slangu) - ogromne w ilości jednego postu. Dlatego spróbuję krótko, ale jak możesz zrozumieć, jak zebrać moje myśli w wiązce i przekazać je.

Zacznę od tego, że istnieje kilka odmian wyrażeń regularnych:

1. Tradycyjne wyrażenia regularne (Są podstawowe, podstawowe i podstawowe wyrażenia regularne (BRE))

  • składnia tych wyrażeń jest zdefiniowana jako przestarzała, ale jednak nadal jest szeroko rozpowszechniona i używana przez wiele narzędzi UNIX
  • Główne wyrażenia regularne obejmują następujące metasimwole (o ich wartościach poniżej):
    • () - Wstępna opcja dla () (w zaawansowanym)
    • () - Wstępna opcja dla () (w zaawansowanym)
    • \n. gdzie n. - Numer od 1 do 9
  • Cechy korzystania z Metasimvols:
    • Star musi przestrzegać po wyrażeniu odpowiadającym pojedynczym symbolem. Przykład: *.
    • Wyrażenie \\( blok) * Należy uważać się za źle. W niektórych przypadkach odpowiada sobie zero lub więcej powtórzeń blok . W innych odpowiada łańcuchowi blok* .
    • W klasie symbolicznej wartości specjalne są ignorowane głównie. Specjalne przypadki:
    • Aby dodać symbol ^ do zestawu, należy go umieścić w pierwszej kolejności.
    • Aby dodać symbol do zestawu, należy go umieścić pierwszy lub ostatni. Na przykład:
      • szablon DNS, gdzie litery, cyfry, minus i separator punktowy mogą obejmować: [-0-9A-ZA-Z.];
      • każda postać, poza minusami i liczbami: [^ -0-9].
    • Aby dodać symbol [lub] do zestawu, należy go najpierw umieścić. Na przykład:
      • odpowiada], [, a lub b.

2. Rozszerzone wyrażenia regularne (oni są rozszerzone wyrażenia regularne (Ere))

  • Składnia tych wyrażeń jest podobna do składni głównych wyrażeń, z wyjątkiem:
    • Anulowano użycie linii odwrotnej warkocza dla Metasimvols () i ().
    • Odwrotna linia napadowa przed metadimolem jest anulowana jego szczególnym znaczeniem.
    • Odrzucony teoretycznie. nieregularny projekt n. .
    • Dodano Metacimol +? , |. .

3. Wyrażenia regularne kompatybilne z Perl(oni są Wyrażenia regularne zgodne z perl (PCRE))

  • mieć bogatszy, a jednocześnie przewidywalna składnia niż nawet POSIX ERE, więc często stosuje się aplikacje.

Wyrażenia regularne składać się zszablony Określ szablon. Szukaj. Wzór składa się z zasadywyszukiwanie, które są kompilowane symbolikai metasimvolov..

Zasady wyszukiwania Zdefiniowane w następujący sposób operacje.:

Listing |.

Cecha pionowa (|) Działa dopuszczalne opcje, można powiedzieć - logiczne lub. Na przykład "szary | szary" odpowiada szary. lub szary.

Grupowanie lub związek ()

Okrągłe wsporniki Używane do określenia obszaru działania i priorytetu operatorów. Na przykład "szary | szary" i "gr (a | e) y" są różnymi próbkami, ale oboje opisują zestaw zawierający szary. i szary.

Kwantyfikacja ()? * +.

Kwantyfikator Po symbolu lub grupie określa ile razy poprzedniwyrażenie może wystąpić.

ogólne wyrażenie, powtórzenia mogą być od m do n inclusive.

ogólny wyraz m i więcej powtórzeń.

ogólny wyraz nie więcej niż N Powtórzenie.

gładki n Powtórzenia..

Znak zapytaniaznaczy 0 lub 1. razy tak samo jak {0,1} . Na przykład "Colou? R" odpowiada kolor, JA. kolor..

Gwiazdaznaczy 0, 1 lub dowolna liczba Pewnego razu ( {0,} ). Na przykład odpowiada "Go * Gle" gleba, gogle., google itd.

Plusznaczy co najmniej 1. Pewnego razu ( {1,} ). Na przykład mecze "GO + GLE" gogle., google itd. (Ale nie gleba).

Konkretna składnia tych wyrażeń regularnych zależy od wdrożenia. (to jest w podstawowe wyrażenia regularne Symbolika (i)- Ekranowany bandlash)

MetakeryPo prostu są to symbole, które nie pasują do ich rzeczywistej wartości, czyli symbolem. (punkt) nie jest punktem, ale dowolną postacią itp. Zapoznaj się z metasimwolami i ich wartościami:

. odpowiada jedenkażdy symbol
[coś] Odpowiada każdysymbol z liczby więźniów w nawiasach. W tym samym czasie: symbol "-" jest interpretowany dosłownie tylko wtedy, gdy znajduje się bezpośrednio po otwarciu lub przed wspornikiem zamykającym: lub [-Abc]. W przeciwnym razie oznacza interwał znaków. Na przykład odpowiada "A", "B" lub "C". odpowiada literom alfabetu łacińskiego łacińskiego. Oznaczenia te można łączyć: odpowiada A, B, C, Q, R, S, T, U, V, W, X, Y, ZC w celu ustalenia korespondencji znaków "[" lub "]", wystarczy Do wspornika zamykającego był to pierwszy znak po otwarciu: odpowiada "]", "[", "A" lub "B". Jeśli wartość w nawiasach kwadratowych została przedstawiona symbolem ^, a następnie wartość wyrażenia odpowiada do pojedynczy symbol spośród nich. które nie są w nawiasach. Na przykład [^ ABC] odpowiada dowolnym symbolowi oprócz "A", "B" lub "C". [^ a-Z] odpowiada dowolnej postaci z wyjątkiem symboli dolnego rejestru w alfabecie łacińskiej.
^ Odpowiada początkowi tekstu (lub początek dowolnego ciągu, jeśli linia jest linią).
$ Odpowiada końcu tekstu (lub koniec dowolnego ciągu, jeśli tryb linii).
() lub () Ogłasza "nazwany" (zgrupowany wyraz), który może być używany później (patrz następujący element: \\ n.). "Zapowiedziana subskrypcja" jest także "blokiem". W przeciwieństwie do innych operatorów, to (w tradycyjnej składni) wymaga bexlesh, w rozszerzonym symbolem i symbolem Perl nie jest potrzebny.
\n. Gdzie n. - Jest to liczba od 1 do 9; odpowiada n.- Aby zauważyć w domu (na przykład (ABCD) 0, to znaczy znaki ABCD są znane przez zero). Ten projekt teoretycznie nieregularnyNie została przyjęta w zaawansowanej składni wyrażeń regularnych.
*
  • Gwiazdapo wyrażaniu odpowiadającej symbolu jednostki zerolub jeszcze kopietego (poprzedzającego) wyrażenia. Na przykład "*" odpowiada pustym łańcuchowi "X", "Y", "ZX", "ZYX" itp.
  • \n.*, gdzie n. - Jest to liczba od 1 do 9, odpowiada zero lub więcej wpisów dla zgodności. n.- wyraźna imitacja. Na przykład "(a.) C 1 *" odpowiada "abcabowi" i "abcabie", ale nie "abcac".

Wyrażenie zawarte w "(" i "()" i towarzyszy "*" należy uznać za niepoprawne. W niektórych przypadkach odpowiada zero lub większej liczbie wystąpień łańcucha, który został zamknięty w nawiasach. W innych odpowiada wyrażeniu zamkniętym w uchwycie, biorąc pod uwagę symbol "*".

\{x.,y.\} Odpowiada ostatnim ( nadchodzący) przynajmniej blokujący blok x. i nie więcej y. czas. Na przykład "A (3.5)" odpowiada "AAA", "AAAA" lub "AAAAA". W przeciwieństwie do innych operatorów, to (w tradycyjnej składni) wymaga Bexlesh.
.* Oznaczenie dowolnej liczby dowolnych znaków między dwiema częściami wyrażenia regularnego.

Metasimwalls Pomagamy użyć innej zgodności. Ale jak wyobrazić sobie metacimum przez zwykły symbol, czyli symbolem [(wspornik kwadratowy) wartość wspornika kwadratowego? Po prostu:

  • trzeba zapobiec ( tarcza) Metacimol (. * + ()) Landlash. Na przykład \\. lub [

Aby uprościć zadanie ustawień niektórych znaków, były one łączone w tzw. klasy i kategorie znaków. POSIX znormalizowana deklarację niektórych klas i kategorii znaków, jak pokazano w poniższej tabeli:

Klasa Posix. podobnie przeznaczenie
[: Górna:] symbole górnego rejestru
[: Dolna:] symbole dolnego rejestru
[: Alpha:] symbole górnego i dolnego rejestru
[: Alnum:] liczby, symbole górnego i dolnego rejestru
[: Cyfra:] liczby
[: XDigit:] numery szesnastkowe
[: Arte:] [.,!?:…] oznaki interpunkcji
[: Puste:] [t] przestrzeń i karta.
[: Przestrzeń:] [t n r f symbole pasa
[: Cntrl:] symbole kontrolne.
[: Wykres:] [^ t n r f symbole druku
[: Drukuj:] [^ t n r f symbole drukuj i pomiń symbole

Regex ma coś takiego jak:

Regex Chciwość

Postaram się opisać tak jasno, jak to możliwe. Załóżmy, że chcemy znaleźć wszystko Tagi HTML. W niektórych tekstach. Lokalizował zadanie, chcemy znaleźć wartości więźniów między< и >, wraz z tymi obcasami. Ale wiemy, że mają tagi różna długość I same znaczniki, co najmniej 50 sztuk. Wymień je wszystkie, zawierające w metacharacji - zadanie jest zbyt czasochłonne. Ale wiemy, że mamy wyrażenie. * (Punktuj gwiazdkę), charakteryzująca dowolną liczbę jakichkolwiek znaków w ciągu. Z tym wyrazem spróbujemy znaleźć w tekście (

Więc, Jak utworzyć RAID 10/50 na kontrolerze LSI megaraid (odpowiedni i dla: Intel SRCU42X, Intel SRCS16):

) Wszystkie wartości między< и >. W rezultacie cały ciąg odpowiada temu wyrażeniu. Dlaczego, ponieważ Remex - Zhaden i stara się uchwycić wszelkie liczby znaków między< и >odpowiednio, cały początek linii < p\u003e Tak, ...i wykończenie ...> będzie należeć do tej reguły!

Mam nadzieję na przykład jasne, że chciwość jest. Aby pozbyć się tej chciwości, możesz iść na następny sposób:

  • wziąć pod uwagę znaki nie Odpowiednia pożądana próbka (na przykład:<[^>] *\u003e W przypadku opisanego powyżej)
  • niezawodne z chciwości, dodając definicję kwantyfikatora jako niepożądane:
    • *? - "nie chciwy" ("leniwy") równoważny *
    • +? - "nie chciwy" ("leniwy") równoważny +
    • (N)? - "nie chciwy" ("leniwy") równoważny (n,)
    • . *? - "nie chciwy" ("leniwy") równoważny. *

Wszystkie powyższe chcesz uzupełnić składnia rozszerzonych wyrażeń regularnych:

Wyrażenia regularne w Posix są podobne do tradycyjnej składni Unix, ale z dodatkiem niektórych metasimwoli:

Pluswskazuje to poprzednisymbol lub. grupamoże być powtarzany jeden lub kilka razy. W przeciwieństwie do gwiazd, wymagane jest co najmniej jedno powtórzenie.

Znak zapytania Robi poprzednisymbol lub grupa jest opcjonalna. Innymi słowy, w odpowiednim wierszu może być nieobecny lub obecny gładki jedenczas.

Cecha pionowaakcje alternatywne opcje Wyrażenia regularne. Jedna postać ustala dwie alternatywy, ale może wystarczyć więcej, wystarczy użyć bardziej pionowych skrapań. Należy pamiętać, że operator używa maksymalnej możliwej części wyrażenia. Z tego powodu operator alternatywny jest najczęściej używany wewnątrz wsporników.

Odwołano również zastosowanie odwrotnej warkocza [...) staje się (...) i (...) staje się (...).

Pod koniec postu dam kilka przykładów przy użyciu REGEX:

$ Cat Text1 1 Apple 2 Pear 3 Banana $ Grep P Text1 1 Apple 2 Gruszka $ Grep "PP *" Text1 1 Apple 2 Gruszka $ Cat Text1 | Grep "l | n" 1 jabłko 3 banan $ echo -e "Znajdź n * tutaj" | Grep "*" * Tutaj $ GREP "PL? * R" Text1 # P, w liniach, gdzie znajduje się R 2 Gruszka $ grep "A." Text1 # rzędy z a, a następnie co najmniej 2 symbole 1 jabłko 3 Banana $ Grep "" Text1 # Wyszukaj linie, gdzie są 3 lub P 1 Apple 2 gruszka 3 banana $ echo -e "Znajdź n * tutaj nsomewhere". |. Grep "[. *]" * Tutaj gdzieś .. Nazwa] $ Echo -e "123 N456 N789 N0" | grep "" 123 456 789 $ Sed -e "/ (a. **) | (-P. * / A / S / A / G" Text1 # Wymiana i na wszystkich liniach, gdzie po Idzie lub po P, P 1 Apple 2 gruszka 3 Banana * ./ Ostatnie słowo./g "Najpierw. Ostatnie słowo. To ostatnie słowo.

Z poważaniem, Mc.Sim!

W dzisiejszym artykule chcę dotknąć takiego ogromnego tematu Wyrażenia regularne. Myślę, że wszyscy wiedzą, że temat regulatorów (tak wyrażenia regularne są nazywane w slangu) - ogromne w ilości jednego postu.

Zacznę od tego, że istnieje kilka odmian wyrażeń regularnych:

1. Tradycyjne wyrażenia regularne (Są podstawowe, podstawowe i podstawowe wyrażenia regularne (BRE))

  • składnia tych wyrażeń jest zdefiniowana jako przestarzała, ale jednak nadal jest szeroko rozpowszechniona i używana przez wiele narzędzi UNIX
  • Główne wyrażenia regularne obejmują następujące metasimwole (o ich wartościach poniżej):
    • () - Wstępna opcja dla () (w zaawansowanym)
    • () - Wstępna opcja dla () (w zaawansowanym)
    • \n. gdzie n. - Numer od 1 do 9
  • Cechy korzystania z Metasimvols:
    • Star musi przestrzegać po wyrażeniu odpowiadającym pojedynczym symbolem. Przykład: *.
    • Wyrażenie \\( blok) * Należy uważać się za źle. W niektórych przypadkach odpowiada sobie zero lub więcej powtórzeń blok . W innych odpowiada łańcuchowi blok* .
    • W klasie symbolicznej wartości specjalne są ignorowane głównie. Specjalne przypadki:
    • Aby dodać symbol ^ do zestawu, należy go umieścić w pierwszej kolejności.
    • Aby dodać symbol do zestawu, należy go umieścić pierwszy lub ostatni. Na przykład:
      • szablon DNS, gdzie litery, cyfry, minus i separator punktowy mogą obejmować: [-0-9A-ZA-Z.];
      • każda postać, poza minusami i liczbami: [^ -0-9].
    • Aby dodać symbol [lub] do zestawu, należy go najpierw umieścić. Na przykład:
      • odpowiada], [, a lub b.

2. Rozszerzone wyrażenia regularne (oni są rozszerzone wyrażenia regularne (Ere))

  • Składnia tych wyrażeń jest podobna do składni głównych wyrażeń, z wyjątkiem:
    • Anulowano użycie linii odwrotnej warkocza dla Metasimvols () i ().
    • Odwrotna linia napadowa przed metadimolem jest anulowana jego szczególnym znaczeniem.
    • Odrzucony teoretycznie. nieregularny projekt n. .
    • Dodano Metacimol +? , |. .

3. Wyrażenia regularne kompatybilne z Perl(oni są Wyrażenia regularne zgodne z perl (PCRE))

  • mieć bogatszy, a jednocześnie przewidywalna składnia niż nawet POSIX ERE, więc często stosuje się aplikacje.

Wyrażenia regularne składać się zszablony Określ szablon. Szukaj. Wzór składa się z zasadywyszukiwanie, które są kompilowane symbolikai metasimvolov..

Zasady wyszukiwania Zdefiniowane w następujący sposób operacje.:

Listing |.

Cecha pionowa (|) Działa dopuszczalne opcje, można powiedzieć - logiczne lub. Na przykład "szary | szary" odpowiada szary. lub szary.

Grupowanie lub związek ()

Okrągłe wsporniki Używane do określenia obszaru działania i priorytetu operatorów. Na przykład "szary | szary" i "gr (a | e) y" są różnymi próbkami, ale oboje opisują zestaw zawierający szary. i szary.

Kwantyfikacja ()? * +.

Kwantyfikator Po symbolu lub grupie określa ile razy poprzedniwyrażenie może wystąpić.

ogólne wyrażenie, powtórzenia mogą być od m do n inclusive.

ogólny wyraz m i więcej powtórzeń.

ogólny wyraz nie więcej niż N Powtórzenie.

gładki n Powtórzenia..

Znak zapytaniaznaczy 0 lub 1. razy tak samo jak {0,1} . Na przykład "Colou? R" odpowiada kolor, JA. kolor..

Gwiazdaznaczy 0, 1 lub dowolna liczba Pewnego razu ( {0,} ). Na przykład odpowiada "Go * Gle" gleba, gogle., google itd.

Plusznaczy co najmniej 1. Pewnego razu ( {1,} ). Na przykład mecze "GO + GLE" gogle., google itd. (Ale nie gleba).

Konkretna składnia tych wyrażeń regularnych zależy od wdrożenia. (to jest w podstawowe wyrażenia regularne Symbolika (i)- Ekranowany bandlash)

MetakeryPo prostu są to symbole, które nie pasują do ich rzeczywistej wartości, czyli symbolem. (punkt) nie jest punktem, ale dowolną postacią itp. Zapoznaj się z metasimwolami i ich wartościami:

. odpowiada jedenkażdy symbol
[coś] Odpowiada każdysymbol z liczby więźniów w nawiasach. W tym samym czasie: symbol "-" jest interpretowany dosłownie tylko wtedy, gdy znajduje się bezpośrednio po otwarciu lub przed wspornikiem zamykającym: lub [-Abc]. W przeciwnym razie oznacza interwał znaków. Na przykład odpowiada "A", "B" lub "C". odpowiada literom alfabetu łacińskiego łacińskiego. Oznaczenia te można łączyć: odpowiada A, B, C, Q, R, S, T, U, V, W, X, Y, ZC w celu ustalenia korespondencji znaków "[" lub "]", wystarczy Do wspornika zamykającego był to pierwszy znak po otwarciu: odpowiada "]", "[", "A" lub "B". Jeśli wartość w nawiasach kwadratowych została przedstawiona symbolem ^, a następnie wartość wyrażenia odpowiada do pojedynczy symbol spośród nich. które nie są w nawiasach. Na przykład [^ ABC] odpowiada dowolnym symbolowi oprócz "A", "B" lub "C". [^ a-Z] odpowiada dowolnej postaci z wyjątkiem symboli dolnego rejestru w alfabecie łacińskiej.
^ Odpowiada początkowi tekstu (lub początek dowolnego ciągu, jeśli linia jest linią).
$ Odpowiada końcu tekstu (lub koniec dowolnego ciągu, jeśli tryb linii).
() lub () Ogłasza "nazwany" (zgrupowany wyraz), który może być używany później (patrz następujący element: \\ n.). "Zapowiedziana subskrypcja" jest także "blokiem". W przeciwieństwie do innych operatorów, to (w tradycyjnej składni) wymaga bexlesh, w rozszerzonym symbolem i symbolem Perl nie jest potrzebny.
\n. Gdzie n. - Jest to liczba od 1 do 9; odpowiada n.- Aby zauważyć w domu (na przykład (ABCD) 0, to znaczy znaki ABCD są znane przez zero). Ten projekt teoretycznie nieregularnyNie została przyjęta w zaawansowanej składni wyrażeń regularnych.
*
  • Gwiazdapo wyrażaniu odpowiadającej symbolu jednostki zerolub jeszcze kopietego (poprzedzającego) wyrażenia. Na przykład "*" odpowiada pustym łańcuchowi "X", "Y", "ZX", "ZYX" itp.
  • \n.*, gdzie n. - Jest to liczba od 1 do 9, odpowiada zero lub więcej wpisów dla zgodności. n.- wyraźna imitacja. Na przykład "(a.) C 1 *" odpowiada "abcabowi" i "abcabie", ale nie "abcac".

Wyrażenie zawarte w "(" i "()" i towarzyszy "*" należy uznać za niepoprawne. W niektórych przypadkach odpowiada zero lub większej liczbie wystąpień łańcucha, który został zamknięty w nawiasach. W innych odpowiada wyrażeniu zamkniętym w uchwycie, biorąc pod uwagę symbol "*".

\{x.,y.\} Odpowiada ostatnim ( nadchodzący) przynajmniej blokujący blok x. i nie więcej y. czas. Na przykład "A (3.5)" odpowiada "AAA", "AAAA" lub "AAAAA". W przeciwieństwie do innych operatorów, to (w tradycyjnej składni) wymaga Bexlesh.
.* Oznaczenie dowolnej liczby dowolnych znaków między dwiema częściami wyrażenia regularnego.

Metasimwalls Pomagamy użyć innej zgodności. Ale jak wyobrazić sobie metacimum przez zwykły symbol, czyli symbolem [(wspornik kwadratowy) wartość wspornika kwadratowego? Po prostu:

  • trzeba zapobiec ( tarcza) Metacimol (. * + ()) Landlash. Na przykład \\. lub [

Aby uprościć zadanie ustawień niektórych znaków, były one łączone w tzw. klasy i kategorie znaków. POSIX znormalizowana deklarację niektórych klas i kategorii znaków, jak pokazano w poniższej tabeli:

Klasa Posix. podobnie przeznaczenie
[: Górna:] symbole górnego rejestru
[: Dolna:] symbole dolnego rejestru
[: Alpha:] symbole górnego i dolnego rejestru
[: Alnum:] liczby, symbole górnego i dolnego rejestru
[: Cyfra:] liczby
[: XDigit:] numery szesnastkowe
[: Arte:] [.,!?:…] oznaki interpunkcji
[: Puste:] [t] przestrzeń i karta.
[: Przestrzeń:] [t n r f symbole pasa
[: Cntrl:] symbole kontrolne.
[: Wykres:] [^ t n r f symbole druku
[: Drukuj:] [^ t n r f symbole drukuj i pomiń symbole

Regex ma coś takiego jak:

Regex Chciwość

Postaram się opisać tak jasno, jak to możliwe. Załóżmy, że chcemy znaleźć wszystkie tagi HTML w niektórych tekście. Lokalizował zadanie, chcemy znaleźć wartości więźniów między< и >, wraz z tymi obcasami. Ale wiemy, że znaczniki mają inną długość i samych znaczników, co najmniej 50 sztuk. Wymień je wszystkie, zawierające w Metachamivol - zadanie jest zbyt czasochłonne. Ale wiemy, że mamy wyrażenie. * (Punktuj gwiazdkę), charakteryzująca dowolną liczbę jakichkolwiek znaków w ciągu. Z tym wyrazem spróbujemy znaleźć w tekście (

Więc, Jak utworzyć RAID 10/50 na kontrolerze LSI megaraid (odpowiedni i dla: Intel SRCU42X, Intel SRCS16):

) Wszystkie wartości między< и >. W rezultacie cały ciąg odpowiada temu wyrażeniu. Dlaczego, ponieważ Remex - Zhaden i stara się uchwycić wszelkie liczby znaków między< и >odpowiednio, cały początek linii < p\u003e Tak, ...i wykończenie ...> będzie należeć do tej reguły!

Mam nadzieję na przykład jasne, że chciwość jest. Aby pozbyć się tej chciwości, możesz iść na następny sposób:

  • wziąć pod uwagę znaki nie Odpowiednia pożądana próbka (na przykład:<[^>] *\u003e W przypadku opisanego powyżej)
  • niezawodne z chciwości, dodając definicję kwantyfikatora jako niepożądane:
    • *? - "nie chciwy" ("leniwy") równoważny *
    • +? - "nie chciwy" ("leniwy") równoważny +
    • (N)? - "nie chciwy" ("leniwy") równoważny (n,)
    • . *? - "nie chciwy" ("leniwy") równoważny. *

Wszystkie powyższe chcesz uzupełnić składnia rozszerzonych wyrażeń regularnych:

Wyrażenia regularne w Posix są podobne do tradycyjnej składni Unix, ale z dodatkiem niektórych metasimwoli:

Pluswskazuje to poprzednisymbol lub. grupamoże być powtarzany jeden lub kilka razy. W przeciwieństwie do gwiazd, wymagane jest co najmniej jedno powtórzenie.

Znak zapytania Robi poprzednisymbol lub grupa jest opcjonalna. Innymi słowy, w odpowiednim wierszu może być nieobecny lub obecny gładki jedenczas.

Cecha pionowaudział alternatywnych opcji wyrażeń regularnych. Jedna postać ustala dwie alternatywy, ale może wystarczyć więcej, wystarczy użyć bardziej pionowych skrapań. Należy pamiętać, że operator używa maksymalnej możliwej części wyrażenia. Z tego powodu operator alternatywny jest najczęściej używany wewnątrz wsporników.

Odwołano również zastosowanie odwrotnej warkocza [...) staje się (...) i (...) staje się (...).

Pod koniec postu dam kilka przykładów przy użyciu REGEX:

$ Cat Text1 1 Apple 2 Pear 3 Banana $ Grep P Text1 1 Apple 2 Gruszka $ Grep Pea Text1 2 Gruszka $ Grep "P *" Text1 1 Apple 2 Pear 3 Banana $ Grep "PP *" Tekst1 1 Apple 2 Gruszka $ grep " X "Text1 $ grep" x * "Text1 1 Apple 2 gruszka 3 banan $ Cat Text1 | Grep "l | n" 1 jabłko 3 banan $ echo -e "Znajdź n * tutaj" | Grep "*" * Tutaj $ Grep "PP +" Text1 # Struny, z zawartością jednego p i 1 lub więcej P 1 Apple $ GREP "PL? E" Text1 1 Apple 2 Gruszka $ GREP "PL? E "Text1 # PE z możliwym symbolem L 1 Apple 2 Gruszka $ grep" p. * R "Text1 # P, w wierszach, gdzie znajdują się R 2 Gruszka $ GREP" A. "Tekst1 # rzędy z a, a następnie na Co najmniej 2 znaki 1 Apple 3 Banana $ Grep "(AN (AN (AN (AN (AN (AN) "" Tekst1 # Wyszukiwanie wierszy, gdzie są 3 lub P 1 Apple 2 Gruszka 3 Banana $ Echo -e "Znajdź n * tutaj nsomewhere". |. Grep "[. *]" * Zainteresowanie. $ # Szukam symboli od 3 do 7 $ echo -e "123 n486 n0" | Grep "" "123 456 789 $ # Szukasz cyfry, za którą nie ma liter N i R $ grep do końca linii" [[: cyfra:]] [^ nr] * $ "Text1 1 Apple $ $ Sed -e "/ (a. * A \\) | (str. * P) / s / a / g" Tekst1 # wymiana i na wszystkich liniach, gdzie po i po r idzie p 1 jabłko 2 gruszka 3 banan $ sed -e "/ ^ [^ lmnxyz] * $ / s / ucha / każdy / g" Text1 # Wymiana ucha na każdym w liniach nie zaczynając od LMNXYZ 1 Apple 2 Peach 3 Banana $ Echo " . Wyrażenie. To jest sensencja. " | # Wymiana ostatniego słowa w zdaniu w ostatnim świecie. \u003e Sed -e "s / [^] * ./ Ostatnie słowo./g" Najpierw. Ostatnie słowo. To ostatnie słowo.

Wyrażenia regularne są bardzo potężnym narzędziem do wyszukiwania tekstu na szablonie, przetwarzaniu i linii, które można wykorzystać do rozwiązania różnych zadań. Oto główny z nich:

  • Sprawdzanie wprowadzania tekstu;
  • Wyszukaj i zastąp tekst w pliku;
  • Pliki zmiany pakietów;
  • Interakcja z usługami, takimi jak Apache;
  • Sprawdzanie ciągu pasującego do szablonu.

Jest daleko pełna listaWyrażenia regularne pozwalają na wiele więcej. Ale dla nowych użytkowników mogą wydawać się zbyt złożone, ponieważ specjalny język jest używany do ich utworzenia. Ale biorąc pod uwagę możliwości, regularne wyrażenia Linuksa powinny znać i być w stanie używać każdego administrator systemu.

W tym artykule rozważymy regularne wyrażenia bash dla początkujących, abyś mógł sobie poradzić ze wszystkimi możliwościami tego narzędzia.

W wyrażeniach regularnych można stosować dwa typy znaków:

  • zwykłe litery;
  • metacimol.

Konwencjonalne postacie są literami, liczbami i znakami interpunkcyjnymi, z których składają się dowolne linie. Wszystkie teksty składają się z liter i można ich użyć w wyrażeniach regularnych, aby wyszukać żądaną pozycję w tekście.

Metasimwalls są czymś innym, to oni dają siłę do wyrażeń regularnych. Za pomocą Metasimvol możesz zrobić znacznie więcej niż szukanie jednego symbolu. Możesz wyszukać kombinacje znaków, użyj dynamicznej liczby ich numeru i wybierz zakresy. Wszystkie specjalne miksery można podzielić na dwa typy, są to symbole wymiany zastępowane znakami konwencjonalnymi lub oświadczeniami, które wskazują, ile razy symbol może powtórzyć. Składnia wyrażenia regularnego będzie wyglądać:

normalny_simviv. specjalny mikser_produkto.

specjalne Simal_Zames. specjalny mikser_produkto.

  • - z odwrotnym warkoczem, zaczynają się specjaliści alfabetyczny i jest używany, jeśli konieczne jest użycie specjalnego monitora w postaci znaku interpunkcyjnego;
  • ^ - Wskazuje początek linii;
  • $ - Wskazuje koniec linii;
  • * - Wskazuje, że poprzedni symbol można powtórzyć 0 lub więcej;
  • + - Wskazuje, że poprzedni symbol powinien powtarzać więcej niż jeden lub więcej razy;
  • ? - Poprzedni symbol może wystąpić zero lub raz;
  • (N) - Wskazuje liczbę razy, ile razy musisz powtórzyć poprzedni symbol;
  • (N, n) - Poprzedni symbol można powtórzyć z N do N razy;
  • . - dowolny znak oprócz tłumaczenia ciągu;
  • - dowolna postać określona w nawiasach;
  • x | W. - Symbol X lub Y Symbol;
  • [^ Az] - każda postać, z wyjątkiem tych wskazanych w nawiasach;
  • - dowolny znak z określonego zakresu;
  • [^ a-z] - dowolna postać, która nie znajduje się w zasięgu;
  • b. - Oznacza głowę słowo z przestrzenią;
  • B. - Wskazuje, że symbol musi znajdować się wewnątrz słowa, na przykład, UX zbiega się z UXB lub Tuxedo, ale nie pokrywa się z Linuksa;
  • rE. - oznacza, że \u200b\u200bpostać jest cyfrą;
  • RE. - symbol nie-cyfabryczny;
  • n. - symbol tłumaczenia linii;
  • s. - jeden z symboli przestrzeni, przestrzeni, tabulacji i tak dalej;
  • S. - dowolny znak poza przestrzenią;
  • t. - symbol tabl;
  • v. - symbol pionowej tabulacji;
  • w. - dowolny symbol litery, w tym podkreśla;
  • W. - dowolny symbol literowy z wyjątkiem podkreślenia;
  • uxxx. - Symbol Unicnoe.

Ważne jest, aby pamiętać, że przed ikonowymi promieniami należy użyć ukośnej cechy, aby wskazać, że specjalista jest następny. To prawda, a odwrotnie, jeśli chcesz użyć specjalisty, który jest stosowany bez slasha jako konwencjonalny symbol, będziesz musiał dodać nachylenie.

Na przykład chcesz znaleźć linię 1+ 2 \u003d 3 w tekście. Jeśli używasz tej linii jako wyrażenia regularnego, nic nie znajdziesz, ponieważ system interpretuje plus jako specjalista, który informuje, że poprzednia jednostka musi powtórzyć jeden lub więcej razy. Dlatego należy go ekranować: 1 + 2 \u003d 3. Bez ekranowania nasze wyrażenie regularne odpowiadałby tylko ciąg 11 \u003d 3 lub 111 \u003d 3 i tak dalej. Zanim linia nie jest konieczna, ponieważ nie jest to specjalista.

Przykłady stosowania wyrażeń regularnych

Teraz, gdy uznaliśmy podstawy i wiemy, jak wszystko działa, pozostaje skonsolidować wiedzę zdobytą o regularnych wyrażeniach grep Linuksa w praktyce. Dwa bardzo przydatne symbole specjalne są ^ i $, które wskazują na początek i koniec ciągu. Na przykład chcemy, aby wszyscy użytkownicy zarejestrowali w naszym systemie, którego nazwisko zaczyna się od s. Następnie możesz zastosować wyrażenie regularne «^ S». Możesz użyć polecenia Egrep:

egrep "^ s" / etc / passwd

Jeśli chcemy wybrać łańcuchy zgodnie z ostatnim znakiem w linii, która może być używana w tym celu. Na przykład wybierz wszystko użytkownicy systemu., bez powłoki, rekordy na temat takich użytkowników kończą się FAŁSZ:

egrep "False $" / etc / passwd

Aby wyświetlić nazwy użytkowników, które zaczynają się od S lub D, używają takiego wyrażenia:

egrep "^" / etc / passwd

Ten sam wynik można uzyskać za pomocą symbolu "|". Pierwsza opcja jest bardziej odpowiednia dla zakresów, a druga jest często używana do normalności lub / lub:

egrep "^" / etc / passwd

Teraz wybierzmy wszystkich użytkowników, których nazwisko to nie trzy znaki. Nazwa użytkownika jest zakończona dwukropkiem. Możemy powiedzieć, że może zawierać dowolne symbol litery, który należy powtórzyć trzy razy, przed dwukropkiem:

egrep "^ W (3):" / etc / passwd

wnioski

W tym artykule sprawdziliśmy regularne wyrażenia Linux, ale były to tylko najbardziej podstawowe. Jeśli palisz trochę głębiej, znajdziesz to z tym narzędziem możesz zrobić znacznie bardziej interesujące rzeczy. Czas poświęcony na rozwój wyrażeń regularnych na pewno to kosztował.

Pod koniec wykładu z wyrażeń regularnych Yandex Pro: