Bash Regexps dla początkujących z przykładami
- 901
- 245
- Tomasz Szatkowski
Korzystanie z wyrażeń regularnych w Bash zapewnia dużą moc, aby przeanalizować prawie każdy możliwy ciąg tekstowy (lub nawet pełne dokumenty) i przekształcić je w prawie dowolne pożądane wyjście. Jeśli regularnie korzystasz z BASH lub jeśli regularnie pracujesz z listami, strunami tekstowymi lub dokumentami w Linux, przekonasz się, że wiele zadań można uprościć, ucząc się, jak korzystać z wyrażeń regularnych w Bash. Kontynuuj czytanie, aby nauczyć się podstawowych umiejętności ekspresji regularnej Bash! Jeśli znasz już podstawowe wyrażenia regularne w Bash lub innym języku kodowania, zobacz nasze bardziej zaawansowane wyrażenia regularne Bash. Jeśli nie, kontynuuj czytanie, aby nauczyć się podstawowych umiejętności ekspresji regularnej bash!
W tym samouczku się nauczysz:
- Jak używać wyrażeń regularnych w wierszu poleceń w Bash
- Jak wyrażenia regularne mogą analizować i przekształcić dowolny ciąg tekstowy i/lub dokument
- Podstawowe przykłady wykorzystania wyrażeń w BASH
Zastosowane wymagania i konwencje oprogramowania
Kategoria | Wymagania, konwencje lub wersja oprogramowania |
---|---|
System | Niezależny od rozkładu Linuksa |
Oprogramowanie | Wiersz poleceń Bash, system oparty na Linuksie |
Inny | Narzędzie SED jest używane jako przykładowe narzędzie do stosowania wyrażeń regularnych |
Konwencje | # - Wymaga, aby podane Linux -commands były wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda$-wymaga wykonania Linux-commands jako zwykłego niewidzianego użytkownika |
Przykład 1: Nasz pierwszy wyrażenie regularne
Istnieje kilka wspólnych narzędzi linii poleceń, takich jak SED i GREP, które akceptują wprowadzanie wyrażenia regularnego. I nie musisz wprowadzać żadnych zmian w narzędziu (użycie lub konfiguracji), aby móc używać wyrażeń regularnych; Są domyślnie świadomie regex. Spójrzmy na przykład nieregex, w którym się zmieniamy ABC
do XYZ
Pierwszy:
$ echo „ABC” | sed 's/abc/xyz/' xyz
Tutaj użyliśmy Echo do wyświetlania ciągu ABC
. Następnie przekazujemy wyjście z tego echa (za pomocą rury, i.mi. |
, charakter) na narzędzie SED. SED jest edytorem strumieni do filtrowania i przekształcania tekstu. Zachęcam do sprawdzania szczegółowego podręcznika poprzez pisanie Man Sed
w wierszu poleceń.
Po przekazaniu do SED przekształcamy ciąg, używając składni specyficznej dla SED (i Regex-Aware). Polecenie, które przekazujemy do SED (mianowicie S/ABC/XYZ/
) można również odczytać jako zastąpić ABC WYZ
. S
oznacza zastępcę i charakter separatora (/
w naszym przypadku) wskazuje, gdzie kończy się jedna sekcja polecenia i/lub inna. Zauważ, że możemy również użyć innych znaków separatora w SED, jak |
, Jak widzieliśmy w późniejszych przykładach.
Teraz zmieńmy to polecenie na przykład wyrażenia regularnego.
$ echo „ABC” | sed 's/./xyz/g 'xyzxyzxyz
Wow, co się tutaj stało? 🙂
Wprowadziliśmy kilka małych zmian, które znacząco wpłynęły na wynikowy wynik. Po pierwsze, zamieniliśmy ABC
w wierszu poleceń SED .
. To nie jest regularna/dosłowna kropka, ale raczej kropka o regularnej ekspresji. I, w wyrażeniu regularnym, kropka oznacza Każda postać. Teraz powinno zacząć wyglądać wyraźniej, zwłaszcza gdy zauważysz inną małą zmianę, którą dokonaliśmy: G
. Najłatwiej o pomyśleniu G
jest jak światowy
; powtarzające się wyszukiwanie i zastąpienie.
Zwróć też uwagę jak S
to nasze rzeczywiste polecenie SED, a następnie opcje tego polecenia (dwa teksty zastępcze) i G
jest kwalifikatorem nad poleceniem. Zrozumienie tego dobrze pomaga w nauce składni SED w tym samym czasie.
Tak więc, w przeciwieństwie do naszego przykładu nie regularnego wyrażenia pięści, a w języku naturalnym to nowe polecenie można odczytać jako Zastąp dowolnego samego charakteru XYZ
, i powtarzalnie („globalnie”) rób to, dopóki nie osiągniesz końca sznurka. Innymi słowy, A
jest zmieniany na XYZ
, B
jest zmieniany na XYZ
itp., powodując potrójną moc XYZ.
Wszystko na pokładzie? Świetnie! Właśnie nauczyłeś się używać wyrażeń regularnych. Zanurzmy się dalej.
Przykład 2: Małe zastrzeżenie
$ echo „ABC” | sed | \.| XYZ | G 'ABC
Ups. Co się stało? Wprowadziliśmy kilka drobnych zmian, a wyjście zmieniło się zasadniczo, tak jak w naszym poprzednim przykładzie. Wyrażenia regularne są bardzo potężne, jak możesz tu zacząć, a nawet niewielka zmiana może mieć dużą różnicę w wyjściu. Stąd zwykle istnieje potrzeba dobrego testowania wyrażeń. I chociaż nie jest to tutaj, bardzo ważne jest również, aby zawsze zastanowić się, w jaki sposób na wyniki wyrażeń regularnych mogą wpływać różne dane wejściowe. Często nieznacznie zmienione lub zmodyfikowane wejście daje zupełnie inne (i często błędne) wyjście.
Zmieniliśmy dwa drobne elementy; Umieściliśmy \
przed kropką i zmieniliśmy separatory z /
Do |
. Ta ostatnia zmiana nie miała absolutnie żadnej różnicy, jak widać z tego wyjścia;
$ echo „ABC” | SED |.| xyz | g 'xyzxyzxyz
I możemy dokładnie sprawdzić nasze ustalenia, używając tego polecenia:
$ echo „ABC” | sed 's/\./XYZ/G 'ABC
Zgodnie z oczekiwaniami, |
Do /
Zmiana nie miała znaczenia.
Więc wróć do naszego dylematu - powiemy, że niewielka zmiana dodawania \
jest winny? Ale czy to naprawdę wina?
NIE. To, co zrobiliśmy, dokonując tej prostej zmiany, to dokonać .
Doth w dosłowne (\.
) DOT. Innymi słowy, nie jest to już prawdziwe wyrażenie regularne w pracy, ale proste zastępowanie ciągów tekstowych, które można odczytać jako zastąpić dosłowną kropkę XYZ
, i rób to powtarzalnie.
Udowodnijmy to;
$ echo „ab… c” | sed 's/\./XYZ/G 'ABXYZXYZC
Jest to zgodne z oczekiwaniami: dwie dosłowne kropki zostały zmienione indywidualnie (ze względu na powtarzającą się naturę G
kwalifikator), do XYZ
, ogólnie rzecz biorąc ABXYZXYZC
.
Super! Rozwińmy teraz trochę więcej.
Przykład 3: Przynieś to
Nie ma to jak nurkowanie w głowie, po prawej? Być może. Dopóki tego nie zobaczysz;
$ echo 'a… b… c' | sed | [\.b] \+| d | g; s | [a-c] | d | g 'ddd
Tak, zbyt złożone, przynajmniej od pierwszego wejrzenia. Zacznijmy od jego uproszczenia:
$ echo 'a… b… c' | sed | [\.b] \+| d | g; ' ADC
Nadal wygląda trochę trudno, ale wkrótce to zrozumiesz. Tak więc, biorąc ciąg wejściowy A… B… C
, Widzimy - na podstawie naszego poprzedniego przykładu - że szukamy dosłownej kropki (\.
). Jednak w tym przypadku następuje po nim B
i otoczony [[[
I ]
. Ta część wyrażenia regularnego ([\.B]
) można odczytać jako Każda dosłowna kropka lub postać B
(Jak dotąd nierepetycznie; i.mi. Pojedyncza karta, jedna z nich, będzie pasować do tego selektora).
Następnie kwalifikujemy to nieco dalej, dołączając \+
do tego Pole wyboru. \+
Wskazuje, że szukamy co najmniej jednego, a być może więcej z tych wymienionych postaci (dosłowne kropki i b). Zauważ, że znaki szukane muszą być tuż obok siebie, w dowolnej kolejności.
Na przykład tekst … B… BBBB…
nadal byłby dopasowany jako pojedyncze zdarzenie, podczas gdy … B… BBB… B.B… BB
(Zwróć uwagę na miejsce) pasowałoby jako osobne (powtarzalne) zdarzenia i oba (i.mi. nie tylko pierwszy) byłby dopasowany. I w takim przypadku oba będą działać z powodu G
globalny/powtarzalny kwalifikator.
Innymi słowy, w języku naturalnym mogliśmy przeczytać to wyrażenie regularne jako zastąpić wszelką ciągłą sekwencję postaci .
I B
z D
i rób to powtarzalnie.
Czy widzisz, co się stanie? W ciągu wejściowego, który mamy … B…
, który jest zgodny z wyrażeniem regularnym, ponieważ zawiera tylko \.
I B
postacie. Jest następnie zastępowany D
w wyniku ADC
.
Nasz większy przykład nagle wygląda prosto. Wróćmy do tego:
$ echo 'a… b… c' | sed | [\.b] \+| d | g; s | [a-c] | d | g 'ddd
Myśląc o tym, jak przekształciła się pierwsza część polecenia SED A… B… C
do ADC
, Możemy teraz o tym pomyśleć ADC
jako dane wejściowe do drugiego polecenia w SED; S | [a-c] | d | g
. Zwróć uwagę, w jaki sposób obie polecenia SED są oddzielone przez ;
.
To się dzieje, to to, że dane wyjściowe tego pierwszego są traktowane jako dane wejściowe dla kolejnego polecenia. To prawie zawsze działa, choć są czasy (przy użyciu złożonej modyfikacji tekstu/dokumentu), w których lepiej jest przekazać wyjście z jednego rzeczywistego polecenia SED do innego polecenia SED za pomocą rury bash (|
).
Analiza drugiego polecenia (S | [a-c] | d | g
) Widzimy, jak mamy inny Pole wyboru który wybierze litery od A do C ([a-c])
); -
Wskazuje zakres liter, który jest częścią składni wyrażenia regularnego.
Pozostałe części tego polecenia mówią teraz za siebie. W sumie to drugie polecenie można zatem odczytać jako zastąpić dowolny dosłowny charakter z zakresem A-C (ja.mi. A, B lub C)
do D
i rób to powtarzalnie. W rezultacie A, D i C (wyjście ADC
z naszego pierwszego polecenia) są renderowane w DDD
.
To bardzo złożone polecenie nie wygląda już tak przerażające, prawda?? Zaokrągńmy w górę.
Przykład 4: Wiadomość pożegnalna
Echo „Miej wspaniały dzień” | SED | $ | Wszystkie |; s | y | y do |; s | $ | you |; s | to [la] \+| to | g; s | $ | All | '
Czy możesz to rozgryźć? Wskazówka; $
oznacza koniec linii w wyrażeniach regularnych. Cała reszta tego złożonego Regex wykorzystuje wiedzę z tego artykułu. Co to jest wyjście? Sprawdź, czy możesz to rozgryźć za pomocą kawałka papieru, bez użycia wiersza poleceń. Jeśli tak - lub jeśli tego nie zrobiłeś 🙂 - daj nam znać w komentarzach poniżej.
Wniosek
W tym samouczku mieliśmy wprowadzenie do podstawowych wyrażeń regularnych, połączonych z kilkoma (zwolennikami) bardziej zaawansowanymi przykładami.
Podczas uczenia się wyrażeń regularnych i sprawdzanie kodu innych osób, zobaczysz wyrażenia regularne, które wyglądają złożone. Poświęć trochę czasu, aby je rozgryźć i bawić się z wyrażeniami regularnymi na wierszu poleceń. Wkrótce będziesz ekspertem, a chociaż analiza złożonych wyrażeń odtwarzania jest zwykle konieczna (umysł po prostu nie nadaje się łatwo czytaniu tak gęstych informacji), stanie się łatwiejsze. Przekonasz się również, że złożona regex, podczas dalszej analizy, zwykle wygląda dość prosto, gdy go zrozumiesz - jak w powyższych przykładach.
Możesz teraz również przeczytać nasz artykuł na temat wyrażeń regularnych w Python, ponieważ wiele informacji podanych tam dotyczy również wyrażeń regularnych, chociaż niektóre wymagania dotyczące formatowania są nieco inne. Zwiększy twoje zrozumienie wyrażeń regularnych, jak z nich korzystać i jak je stosować w różnych sytuacjach i językach kodowania. Gdy zostaniesz ekspertem od regularności, małe linie rozróżnienia między narzędziami a językami programowania zwykle zanikają, a będziesz pamiętać określone wymagania składniowe dla każdego języka lub narzędzia, w którym pracujesz.
Cieszyć się!
Powiązane samouczki Linux:
- Advanced Bash Regex z przykładami
- Rzeczy do zainstalowania na Ubuntu 20.04
- Wyrażenia regularne Pythona z przykładami
- Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
- Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
- Manipulacja Big Data dla zabawy i zysku Część 3
- Big Data Manipulacja dla zabawy i zysku Część 1
- Rzeczy do zrobienia po zainstalowaniu Ubuntu 22.04 JAMMY Jellyfish…
- Rzeczy do zainstalowania na Ubuntu 22.04
- Bash Advanced zmienne idiomy dla wrażliwości na przypadki…