Wstęp

Wstęp

Uczenie się i zrozumienie wyrażeń regularnych może nie być tak proste jak nauka polecenia LS. Jednak uczenie się wyrażeń regularnych i skuteczne wdrażanie ich w codziennej pracy bez wątpienia nagrodzi twoje wysiłki naukowe poprzez większą wydajność pracy i oszczędności czasu. Wyrażenia regularne to temat, który może łatwo wypełnić całą 1000 stron długości. W tym artykule staramy się wyjaśnić podstawy wyrażeń regularnych w zwięzły, nie-geekowy i przykładowy sposób. Dlatego jeśli kiedykolwiek chciałeś nauczyć się podstawowych podstaw ekspresji.

Intencją tego samouczka polega na pokryciu podstawowego rdzenia podstawowych wyrażeń regularnych i rozszerzonych wyrażeń regularnych. W tym celu użyjemy jednego narzędzia, a to będzie polecenie GNU GREP. System operacyjny GNU/Linux i jego polecenie GREP rozpoznają trzy różne typy wyrażeń regularnych:

  • Podstawowe wyrażenia regularne (BRE)
  • Rozszerzone wyrażenia regularne (ERE)
  • Wyrażenia regularne Perl (PRCE)

Różnica między podstawowymi wyrażeniami regularnymi a rozszerzonymi wyrażeniami regularnymi dobrze wyjaśniono chwilowo.

Co to jest wyrażenie regularne

Wyrażenie regularne zapewnia możliwość dopasowania „ciąg tekstu” w bardzo elastyczny i zwięzły sposób. Gdzie „ciąg tekstu” można dalej zdefiniować jako pojedynczy znak, słowo, zdanie lub określony wzór znaków. Dobrze znane skróty „Wyrażenie regularne” obejmują Regex i RegexP.

Prosty przykład wyrażenia regularnego

Najprostszym elementem konstrukcyjnym dowolnego wyrażenia regularnego jest znak. Możemy użyć GREP do wyszukiwania dowolnego konkretnego znaku z tekstu dowolnego podanego pliku nie-binarnego. Na przykład tutaj jest treść naszego Regex.Plik próbki TXT:

$ cat Regex.TXT GREP oznacza: globalny wydruk wyrażenia regularnego 

Teraz możemy użyć GREP do wyszukiwania dowolnej postaci, zapewniając jej wyrażenie regularne. Użyjmy GREP do wyszukiwania postaci „E”:

$ grep e regex.TXT GREP oznacza: wyrażenie regularne 

Jak widać z powyższego przykładu, Grep wydrukował wszystkie linie składające się z co najmniej jednego postaci „E”. Możemy teraz połączyć wiele znaków, aby utworzyć ciąg „RegU” i użyć GREP do wyszukiwania ciągu w tekście:

$ grep regu regex.TXT Regular 

Aby uwolnić prawdziwą moc wyrażeń regularnych, musimy utworzyć wyrażenie regularne z znaków niealfabetycznych (meta-znaków) lub z kombinacji znaków alfabetycznych i niealfabetycznych. Na przykład, co jeśli chcesz przeszukać wszystkie wiersze, które zaczynają się od postaci „G”? W tym celu możemy użyć symbolu Caret „^”:

$ grep ^g regex.TXT GREP oznacza: globalny 

To był tylko fundamentalny przykład bardziej wyrafinowanego wyrażenia regularnego. W tym artykule wyjaśnimy bardziej techniki wyrażeń regularnych jako powyższe, bardziej szczegółowo.

Powiązanie

Jak widać na naszym poprzednim przykładzie, najprostsze wyrażenie regularne może składać się z indywidualnej postaci. Stąd wyrażenie regularne składające się z pojedynczego niestabilnego znaku będzie pasować do dowolnego ciągu zawierającego ten znak. Charakter wyrażeń regularnych zezwoleń na połączenie wielu innych wyrażeń regularnych. Co oznacza, że ​​zestaw znaków takich jak „Press” będzie pasował do dowolnego ciągu zawierającego podłoże utworzone przez połączenie kilku wyrażeń regularnych „P”, „R”, „E”, „S” i „S”.

$ cat Regex.TXT GREP oznacza: Global Regular Expression Print $ GREP Press Regex.wyrażenie txt 

Podstawowe vs rozszerzone wyrażenia regularne

GNU Grep rozumie zarówno podstawowe, jak i rozszerzone wyrażenia regularne. Najważniejszą różnicą jest to, że w podstawowych wyrażeniach regularnych meta-właściciele: ?, +, , |, (i) tracić swoje szczególne znaczenie. Aby dać meta-właściciele specjalne znaczenie, należy je uciekać z postacią. Zastanów się nad następującym przykładem:

Nasz Regex.Plik TXT zawiera teraz następujące:

$ cat Regex.TXT Global | Regularny | Wyrażenie | Drukuj globalny wydruk wyrażenia regularnego 

Polecenie GREP przyjmuje podstawowe wyrażenie regularne jako domyślne. Dlatego następujące polecenie Linux wydrukuje wyłącznie pierwszy wiersz tylko biorąc pod uwagę, że zawiera pod substring „N | P”:

$ grep "n | p" Regex.TXT Global | Zwykle | Wyrażenie | Drukuj 

„|” Operator zmian ma swoje własne specjalne znaczenie, a to jest logiczne lub. Jednak to szczególne znaczenie zostało stłumione w poprzednim przykładzie, ponieważ GREP domyślnie zagroże. Aby GREP odczytał rozszerzone wyrażenia regularne, musimy użyć opcji -e lub po prostu użyć egrep zamiast GREP.

$ grep -e "n | p".TXT Global | Regularny | Wyrażenie | Wydrukuj globalny wydruk wyrażenia regularnego lub $ egrep "n | p" Regex.TXT Global | Regularny | Wyrażenie | Drukuj globalny wydruk wyrażenia regularnego 

W poprzednim przykładzie użyliśmy GREP z rozszerzonym wyrażeniem regularnym, a zatem wyświetla oba linie, które zawierają znak N lub P. Jak wspomniano wcześniej, meta-właściciele straciły swoje szczególne znaczenie, gdy są wyrażone jako podstawowe wyrażenia regularne, chyba że uciekają z postacią „\”. Ponownie wykorzystajmy nasz pierwszy przykład, ale tym razem uciekamy „|” postać:

$ grep "n \ | p".TXT Global | Regularny | Wyrażenie | Drukuj globalny wydruk wyrażenia regularnego 

W tym przypadku operator zmian „|” zachowuje swoje szczególne znaczenie i działa jako logiczne lub nawet jeśli nie użyliśmy opcji -e ani egrep.

Powiedzieliśmy również, że podczas korzystania z opcji eGrep lub -e Grep uważa, że ​​jest karmiony przedłużonymi wyrażeniami regularnymi. Z tego powodu, jeśli uciekniesz z metalu w rozszerzonym kontekście wyrażenia regularnego, straci swoje szczególne znaczenie i zachowa się jako dosłowna postać „|”. Jeśli śledzisz tutaj, zauważysz, że jest to znowu dokładne przeciwieństwo podstawowych wyrażeń regularnych.

Przykład:

$ egrep "n \ | p".TXT Global | Zwykle | Wyrażenie | Drukuj 

Wyrażenia wspornika

Teraz, że jesteśmy zaznajomieni z podstawami wyrażeń regularnych, możemy zaangażować naszą eksplorację w silniejszą i jeszcze bardziej złożoną naturę wyrażeń regularnych. Pierwszym przystankiem będzie użycie „[” i „]” znanego jako „wyrażenia wspornika”. Historia „wyrażeń oddziału” polega na tym, że każde postacie zamknięte przez „[” i „]” będą pasować do dowolnej pojedynczej postaci na tej liście. Owinąć literę „E” z „[]” i zobaczmy, co się stanie:

$ cat Regex.txt global | regularne | wyrażenie | Drukuj globalny wyrażenie regularne wydruku $ grep [e] xpression Regex.TXT Global | Zwykle | Wyrażenie | Drukuj 

Jak widać nic niezwykłego. Nasze obecne wyrażenie regularne jedynie dopasowało słowo kluczowe „wyrażenie” i GREP, a zatem wydrukowano odpowiednią linię. Na tym terenie następujące wyrażenie regularne również zrobi tę samą sztuczkę:

$ grep wyrażenia wyrażenia.TXT Global | Zwykle | Wyrażenie | Drukuj 

Moc wyrażenia wspornika pojawia się, gdy chcesz dopasować na przykład pojedynczy znak na liście „[]”. Pokazano to w poniższym przykładzie:

$ grep [ee] Xpression Regex.TXT Global | Regularny | Wyrażenie | Drukuj globalny wydruk wyrażenia regularnego 

Czy możesz wymyślić sposób, w jaki sformułować alternatywę wyrażenia regularnego dla powyższego przykładu bez użycia „[]”? Taka technika została już wcześniej pokazana!

Za pomocą wyrażenia wspornika można również wyrażać logiczne nie. W tym celu możemy użyć symbolu Caret „^”. W poniższym przykładzie używamy wyrażenia regularnego, aby wyodrębnić wszystkie linie zawierające dowolne znaki z wykluczeniem postaci „A” i „C”.

$ cat Regex.txt a b c d $ grep [^ac] Regex.txt b d 

Zakres ekspresji

Wyrażenie wspornika pozwala również określić zakres wyrażeń. Zakres ekspresji obejmuje minimum dwie postacie oddzielone łącznikiem. Oznacza to, że zamiast [0123456789] możemy po prostu użyć [0-9] lub zamiast [ABC] możemy użyć [a-c]. Ilustruje to w poniższym przykładzie Regex:

$ cat Regex.txt a b c d $ grep [^a-c] Regex.txt d 

Zajęcia postaci

Poniżej znajdują się wstępnie zdefiniowane klasy, których możesz użyć w wyrażeniach nawigacyjnych.

[: Alnum:] - Znaki alfanumeryczne [:alfa:] - Postacie alfabetyczne
[: cntrl:] - Kontroluj postacie. [:cyfra:] - Cyfry: 0 1 2 3 4 5 6 7 8 9.
[:wykres:] - Znaki graficzne [:niżej:] - Małe litery
[:wydrukować:] - Znaki do wydruku [: Putek:] - Postacie interpunkcyjne
[:przestrzeń:] - Postacie kosmiczne [:górny:] - Wielkie litery
[: xDigit:] - Cyfry szesnastkowe

W poniższym przykładzie wyrażenia regularnego użyjemy [: Lower:] i [: Space:] do drukowania tylko linii, które zawierają litery (-y) lub przestrzeń do niższej liczby:

Cat Regex.tekst
1
2
3
A
B
C
,
<-- space
$ grep [[: dolne:] [: Space:]] Regex.tekst
B
C
<-- space

Zakotwiczenie

Zakotwiczenie jest techniką wyrażenia regularnego, która angażuje symbol Caret ^ i znak dolara $ jako meta-właściciela, aby dopasować pusty ciąg od samego początku, a na końcu linii.

Znajdźmy wszystkie wiersze w pliku /etc /usługi, które zaczynają się od ciągu „ftp”:

$ grep ^ftp/etc/usługi ftp-data 20/tcp ftp 21/tcp ftps-data 989/tcp # ftp przez SSL (dane) ftps 990/tcp 

Jako przeciwny przykład możemy użyć zakotwiczenia regularnego, aby znaleźć wszystkie linie kończące się FTP:

$ grep ftp $/etc/usługi ZOPE-FTP 8021/TCP 

UWAGA: Nie myl znaczenia Caret z symbolem Careta używanego w wyrażeniu wsporników, ponieważ mają one dość wyraźne znaczenie w odpowiednim kontekście.

Charakter odwrotny i specjalne wyrażenia

Istnieje wiele narzędzi systemowych, w tym GREP, które obsługują „specjalne wyrażenia” znane również jako granice słów. Oto kilka specjalnych symboli wyrażeń obsługiwanych przez GREP i wiele innych narzędzi systemowych:

  • \< - Dopasuj pusty ciąg na początku słowa
  • \> - Dopasuj pusty ciąg na końcu słowa
  • \B - Dopasuj pusty ciąg na początku i na końcu słowa
  • \B - dopasowanie, z wyjątkiem początku lub na końcu słowa

Zacznijmy \< which will match empty string from the beginning of the word. Here is our tester file:

$ cat Regex.TXT Regularexpressions Regularne wyrażenia regularne 

Poniższe wyrażenie regularne będzie pasować do obu wierszy, ponieważ na każdym wierszu jest pusty ciąg, zanim słowo „regularne”:

$ grep "\RegularnyWyrażenia
Regularny Wyrażenia regulowane ekspresji

Następny przykład wyświetli tylko drugi wiersz, biorąc pod uwagę, że używamy \>, aby dopasować pusty ciąg również na końcu słowa:

$ grep „\” Regex.tekst
Regularny Wyrażenia regulowane ekspresji

Znaczenie \ b jest podobne, ale będzie pasować do obu, pustych ciągów od początku i końca słowa:

$ grep "\ bexpressions \ b".tekst
Wyrażenia regularne Wyrażenia

Podczas gdy \ b będzie pasować tylko wtedy, gdy nie na początku lub na końcu słowa:

$ grep "\ bexpressions \ b".tekst
Regularny WyrażeniaWyrażenia regularne

Aby uzyskać kompletność tej sekcji, tutaj są inne specjalne wyrażenia dostępne dla GREP. Należy pamiętać, że następujące symbole są po prostu skrótem wyżej wymienionych klas znaków:

  • \S - Dopasuj dowolne znaki Whitespace (przestrzeń, zakładka itp.). alias [: Space:]
  • \S - Dopasuj dowolną postać, ale Whitespace (przestrzeń, karta itp.). alias [^[: Space:]]
  • \ w - Dopasuj dowolny znak w zakresie 0–9, a - z i a - z pseudonim [: alnum:]
  • \ W - Dopasuj dowolny znak, ale zakres 0 - 9, a - z i a - z alias [^[: alnum:]]

Oto kilka przykładów klas postaci Skróty:

$ cat Regex.TXT ABCD 1234 " 

Karta mecz:

$ grep „\ s” Regex.tekst 

Dopasuj wszystko oprócz białej przestrzeni:

$ grep „\ s” Regex.TXT ABCD 1234 " 

Dopasuj wszystkie postacie alfanumeryczne:

$ grep „\ w” Regex.TXT ABCD 1234 

Dopasuj wszystkie znaki niealfanumeryczne (obejmują białe listy):

$ grep „\ w” Regex.tekst " 

Powtórzenie

Po wyrażeniu regularnym może nastąpić jeden lub kilka kwantyfikatorów powtórzeń. Zanim przejdziesz do tej sekcji, spójrz na poniższą tabelę:

? - Poprzedni element jest opcjonalny i co najwyżej dopasowany raz
* - Poprzedni element będzie dopasowany zero lub więcej razy.
+ - Poprzedni element zostanie dopasowany jeden lub więcej razy.
N - Poprzedni element jest dopasowany dokładnie n razy.
N, - Poprzedni element jest dopasowany n lub więcej razy.
n, m - Poprzedni element jest dopasowany co najmniej n razy, ale nie więcej niż m.

Zacznijmy od utworzenia naszego przykładowego wyrażenia regularnego.tekst:

$ cat Regex.wyrażenia wyrażające wyrażanie wyrażania wyrażania ekspresji ekspresji ekspresji 

Pierwszy przykład powtórzeń będzie użył „?”:

$ grep -e "expres?jony „Regex.EXPRECJE EXPRESIONS TXT 

Jak opisano w powyższej tabeli, użycie „?„Kwantyfikator ma być dopasowany co najwyżej raz, czyli najwyżej raz lub uczynić poprzedni element opcjonalny. Poprzedni element w naszym przypadku jest postać „S”. Dlatego GREP dopasowało tylko struny z brakiem lub pojedynczym znakiem „S”, a następnie smyczkowane „jony”. Następny kwantyfikator, na który przyjrzymy się „*”, który z definicji będzie pasował do poprzedniego elementu zero lub więcej razy.

$ grep -e „expres*jony”.wyrażenia wyrażające wyrażanie wyrażania wyrażania ekspresji ekspresji ekspresji 

Jak pokazano powyżej, kwantyfikator „*” będzie pasował do wszystkich ciągów w naszym pliku testowym. Jeśli zastanawiasz się, dlaczego pasowało to również do „EXCREIONS”, pamiętaj, że kwantyfikator „*” czyni poprzedni element opcjonalny, w przeciwieństwie do kwantyfikatora „+”, który musi pasować do poprzedniego elementu przynajmniej raz lub więcej razy:

$ grep -e „expres+jony”.wyrażenia wyrażające wyrażanie wyrażania wyrażania wyrażania ekspresji 

Za pomocą kwantyfikatora „n” możesz dokładnie określić, ile razy poprzedni element zostanie dopasowany. Na przykład nasze:

$ grep -e "expres 3 jony".wyrażenia TXT 

Polecenie dopasuje ciąg, który zaczyna się od „Expre”, a następnie 3 x „s”, a następnie „jony”. Aby rozciągnąć nasze poprzednie wyrażenie regularne „n,”, możemy określić minimalną wartość tego, ile razy poprzedni element zostanie dopasowany. W rezultacie powtórzenie „3,” pasowało do 3 lub więcej razy:

$ grep -e "expres 3, jony".Wyrażanie wyrażania TXTSSSSSSSSSISSS 

Aby jeszcze bardziej rozszerzyć powyższe wyrażenie regularne, możemy określić zakres. Dlatego zastępujemy „3,” na „1,3”, a następujący Regex pasowałby:

$ grep -e "expres 1,3 jony".wyrażenia wyrażenia wyrażania wyrażeń 

Ponieważ poprzedni element „S” jest dopasowany co najmniej raz, ale nie więcej niż trzy razy.

Alternacja

Możesz pomyśleć o alternacji Regex jako logicznej lub operacji, w której wyrażenia regularne mogą połączyć jedno lub więcej „|” Operatorzy zmian. W rezultacie to wyrażenie regularne będzie zgodne z dowolnym ciągiem odpowiadającym albo alternatywnego wyrażenia regularnego.

$ cat Regex.TXT GREP oznacza: globalny wyrażenie regularne $ grep -e "^r |^e" Regex.Wyrażenie regularne TXT 

Precedens

Podczas tworzenia wyrażeń istnieje inna właściwość regularnych exppreezonów do rozważenia, a to jest pierwszeństwo. Podobne w obliczeniach arytmetycznych, wyrażenia regularne są zgodne z predefiniowanym pierwszeństwo. Najwyższe pierwszeństwo wymaga „powtórzenia”, a następnie „połączenia”, a najniższe pierwszeństwo należy do „naprzemienności”. Rozważ następujący przykład:

$ cat Regex.TXT Regex Regexxx $ grep -e "Regex 3".TXT Regexxx 

W wyżej wymienionym wyrażeniu regularnym możemy zobaczyć jednocześnie, „Regex”, jak i powtórzenie „X 3”. Ponieważ powtórzenie ma wyższe pierwszeństwo, powyższe wyrażenie regularne będzie pasować do „Regexxx”, ale nie „Regex”.
Innym przykładem, w którym należy wziąć pod uwagę pierwszeństwo, jest użycie operatora zmian „|” który ma najniższe pierwszeństwo ze wszystkich wyrażeń regularnych. Rozważ następujący przykład:

$ cat Regex.TXT Regularne Wyrażenia Wyrażenia $ grep -e "^regularne | wyrażenia $" Regex.wyrażenia regularne wyrażenia regularne TXT 

Ponieważ operator zmian „|” ma najniższe pierwszeństwo Powyższe wyrażenie regularne będzie pasować do dowolnego połączenia wyrażenia. W naszym przypadku będzie to „regularne” z kotwicą „^” i „Wyrażenia” z końcem linii kotwicy „$”. Aby zapewnić dowolny operator regex wyższe pierwszeństwo, musimy użyć „()”. W poniższym przykładzie użyjemy „()”, aby zastąpić pierwszeństwo operatora zmian do wyższego priorytetu, co robi zauważalną różnicę:

$ grep -e "^(regularne | wyrażenia) $" Regex.Wyrażenia regularne TXT 

W tym przykładzie operator zmian jest oceniany jako najpierw, ponieważ tworzy prostą podekspresję za pomocą „()”. Dlatego w rezultacie powyższe wyrażenie regularne dopasuje tylko linie, które zawierają „^regularne $” lub „^wyrażenia $”.

Odniesienia do tyłu i podekspresje

Każde podłoże złożone przez „()” utworzy podekspresję, która może być używana jako odniesienie tylne w kolejnej ekspresji regularnej. Ilustruje to następujący przykład:

$ cat Regex.TXT Regularne wyrażenia $ grep -e "(re) gular exp \ 1sssions" Regex.Wyrażenia regularne TXT 

Podekspresja połączonego wyrażenia regularnego „RE” jest używana jako odniesienie tylne później podczas tworzenia wyrażenia regularnego za pomocą \ 1 cyfry. Zamówienie zastosowane do utworzenia podekspresji „N” musi być spójne z odniesieniem z tyłu „\ n”:

$ grep -e "(r) (e) gular \ 2xp \ 1 \ 2sSsions".Wyrażenia regularne TXT 

Wniosek

Wyrażenia regularne są bardzo potężnym narzędziem w rękach dowolnego administratora systemu, programisty (Bash, Php, C#, Java i wiele innych. W tym artykule próbowano opisać w jakiś prosty, spójny i prosty angielski sposób podstaw regularnych wyrażeń, na których możesz dalej rozwinąć swoje wyrażenia regularne, a tym samym uratować się przed żmudną pracą, którą przetwarzanie tekstu może czasami oferować.

Przykłady wyrażeń regularnych

Przykłady wyrażeń regularnych
Składnia wyrażeń regularnych Opis wyrażeń regularnych
grep -e '^([0-9] 4 [-]?) 3 [0-9] 4 $ '' Credit-card.tekst
Walidacja karty kredytowej. To wyrażenie regularne będzie pasować do dowolnego numeru karty kredytowej w formacie xxxx-xxxx-xxxx-xxxx lub xxxx xxxx xxxx xxxx.
grep '^[: space:]]*$' Regex.tekst
Używając grepa i wyrażenia regularnego, aby znaleźć puste linie
grep -e '\' regex.tekst
Czasami popełniasz błąd, wpisując te same słowa obok siebie w tym samym zdaniu. Na przykład „grep i wyrażenia regularne”. Ta regex dostrzega tego rodzaju literówkę.
grep -e '^\ $ [0-9]+\.[0-9] [0-9] $ 'Regex.tekst
Walizacja waluty z 2 punktami dziesiętnymi. To wyrażenie regularne potwierdzi walutę za pomocą symbolu $ i będzie pasować do 12 USD.46, ale nie 34 €.54 lub 1 USD.333
df | grep -e "(([6-9] [0-9]) | (100))%"
Regex do znalezienia wszystkich partycji w systemie, które wykorzystują ponad 60% miejsca na dysku.
grep -e -o "\ b [a-za-z0-9.-]+@[a-za-z0-9.-]+\.[A-ZA-Z0-9.-]+\ b ”e -maile.tekst
Ta regex pomaga wyodrębnić / znaleźć wszystkie adresy e -mail z dowolnego tekstu.
grep -o '[0-9] \ 1,3 \ \.[0-9] \ 1,3 \ \.[0-9] \ 1,3 \ \.[0-9] \ 1,3 \ ips.tekst
Ten regularność pomaga wyodrębnić / znaleźć wszystkie adresy IP z dowolnego wejścia.
grep -oie '\ b (https?): // [-[: alnum:]+&@#/%?= ~ _ |!:,.;]*[[: alnum:]+
&@#/%= ~ _ |] '.HTM
Wyodrębnia adresy URL z pliku HTML

Powiązane samouczki Linux:

  • Advanced Bash Regex z przykładami
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Bash Regexps dla początkujących z przykładami
  • Mastering Bash Script Loops
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Wyrażenia regularne Pythona z przykładami
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Zagnieżdżone pętle w skryptach Bash
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Manipulacja Big Data dla zabawy i zysku Część 3