Zwiększ swoją produktywność w terminalu Linux, ucząc się tej zaawansowanej składni wyszukiwania

Regex to potężne narzędzie ułatwiające precyzyjne wyszukiwanie w tekstach. Poznaj jego podstawy, składnię i zastosowanie w narzędziach Linux, aby zwiększyć swoją efektywność.
Wyszukiwanie w systemie plików może być trudne. Na przykład, czy czasami trudno jest być konkretnym lub precyzyjnym? A może jest zbyt dużo hałasu? Regex może rozwiązać te problemy i więcej. Jest potężny, uniwersalny i elastyczny, a podstawy pomogą Ci w długiej drodze.
Czym jest Regex?
Regex to język dopasowywania wzorców; to sposób na opisanie wzorców, które pasują do ciągów (np. słów lub zdań). Na przykład, powiedzmy, że przeszukujesz swój dysk twardy w poszukiwaniu obrazu o nazwie foo, ale nie pamiętasz, czy to JPEG, czy PNG. Możemy użyć regex z fd tak: fd 'foo\.(jpg|png)'.
Wiele narzędzi wykorzystuje regex do wyszukiwania, przekształcania i interakcji z tekstem. Na przykład, grep -E [regex], find -regex [regex], lub fd [regex]. Używanie regex oznacza, że możesz być bardzo precyzyjny.
Regex jest używany wszędzie. Większość stron internetowych korzysta z niego w jednej lub innej formie. Regex jest również powszechny w narzędziach i aplikacjach, takich jak ripgrep, Vim, Neovim, Emacs i wielu innych.
Różne Smaki Regex
Regex występuje w różnych smakach, co oznacza zasadniczo różne reguły (czyli składnię). Jest wiele smaków, ale różnią się tylko w niewielkich szczegółach. Jeśli trzymasz się konceptów, które omówię później, będą one działać w większości smaków i narzędzi Linux. Nie musisz zbyt intensywnie o tym myśleć.
PCRE (Perl Compatible Regular Expressions) to najbardziej rozbudowany smak. Wszystkie przykłady starają się być zgodne z PCRE.
Gdy staniesz się profesjonalistą, możesz odwołać się do artykułu w Wikipedii porównującego smaki regex lub do kompleksowej tabeli porównawczej regex. Pamiętaj, że pojęcia, których się nauczysz, powinny mieć zastosowanie wszędzie.
Szybki Przegląd Regexu, Aby Rozwiać Wszelkie Tajemnice
Oto lista, która delikatnie wprowadzi Cię w typowe cechy regex:
Koncepcja | Opis |
---|---|
Klasy znaków | Lista konkretnych znaków, które chcesz dopasować, np. [abc]. |
Grupy dopasowujące | Nawiasy wokół powiązanych części wyrażenia, jak nawiasy w matematyce, np. (foo). |
Modyfikatory | Zmieniają, jak działa wyrażenie, np. wrażliwość na wielkie litery. |
Kotwice | Definiują początek i koniec ciągu, np. ^foo$. |
Kwantyfikatory | Wskazują ilość, np. foo+, foo{3} itd. |
Alternatywa | Po prostu zdanie or, np. foo|bar. |
Metaznak DOTALL | Dopasowuje wszystko, jak wildcard—jest to po prostu pojedyncza kropka. |
Możesz je mieszkać i dopasowywać, aby opisać wzór.
Te cechy mają zastosowanie tylko w przypadku, jeśli używasz ich z flagami komend wymienionymi później. Na przykład, grep -P foo.
Metaznak DOTALL: Dopasuj Wszystko i Wszędzie
Metaznak DOTALL jest jak wildcard, ponieważ dopasowuje wszystko. To po prostu kropka. Będziesz go często używać w miejscach, gdzie powinien dopasować cokolwiek.
Klasy Znaków: Dopasuj Konkretne Znaki w Dowolnej Kolejności
Klasy znaków to lista znaków, zamknięta w nawiasach kwadratowych, które chcesz dopasować. Na przykład, następujące wyrażenie dopasowuje a, b, z, 1, 2 lub 9:
[abz129]
To dopasowuje dowolny znak alfanumeryczny, zarówno wielką, jak i małą literę:
[a-zA-Z0-9]
Myślnik (-) ma specjalne znaczenie w klasie znaków, więc jeśli chcesz go dopasować dosłownie, musisz umieścić go na początku [-a-z] lub go eskapować [a-z\-].
Znów, ważne jest, aby zrozumieć, że klasa znaków dopasowuje dokładnie jeden znak, chyba że użyjesz kwantyfikatora (omówionego później).
Jeśli dokładnie przyjrzysz się ramce wyników na obrazku, zobaczysz, że jedna klasa znaków dopasowuje wiele znaków. Tryb globalny (g) jest za to odpowiedzialny. Tryb globalny oznacza, że regex nie przestaje na pierwszym dopasowaniu, ale kontynuuje i tworzy wiele dopasowań.
Grupy Dopasowujące: Rysuj Granice Wokół Podwyrażeń
W pewnym sensie, dopasowanie.
Grupy są podobne do nawiasów w matematyce. Na przykład, gdy piszesz wyrażenie matematyczne, takie jak 1 + (2 / 2), różni się ono od (1 + 2) / 2. Obliczenia zaczynają się od najgłębszych nawiasów, co zmienia wynik.
Nawiasy w regexie działają jak granice; grupują części wyrażenia razem. Na przykład, foo(bar|baz) nie jest tym samym co foobar|baz, ponieważ to pierwsze dopasuje foobar lub foobaz; to drugie dopasuje foobar lub baz.
Kwantyfikatory: Jak Określić Dokładne i Zmienne Ilości
Kwantyfikatory pozwalają nam definiować ilości. Gdy dopasowujemy znak z DOTALL lub klasami znaków, używamy kwantyfikatorów, aby określić ile. Możemy również stosować kwantyfikatory, aby dopasować grupy, dzięki czemu możemy definiować ilości dla całych wyrażeń.
Dopasuj Zero lub Więcej Rzeczy Z Asteryskiem
Asterysk (*) jest metaznakiem, który dopasuje zero lub więcej rzeczy. Poniższy zapis dopasowuje a, b, z, lub pusty ciąg:
[abz]*
Dopasuj Jedną lub Więcej Rzeczy Z Znakiem Plus
Znak plus (+) jest metaznakiem, który dopasuje jedną lub więcej rzeczy. Poniższy zapis dopasowuje jedną lub więcej liter a, b, lub z:
[abz]+
Spraw, Aby Rzeczy Były Opcjonalne Z Znakiem Zapytania
Znak zapytania (?) jest metaznakiem, który czyni poprzedni element opcjonalnym. Poniższe dopasuje dokładnie jedną a, b, z, lub nic:
[abz]?
Określ Dokładne Ilości Z Ramkami Klamrowymi
Ramki klamrowe pozwalają nam określić dokładną liczbę. Na przykład, poniższe dopasuje a, b, lub z dokładnie dwa razy:
[abz]{2}
Poniższe dopasuje a, b, lub z między 2 a 4 razy:
[abz]{2,4}
Podsumowanie Kwantyfikatorów
- ?: Opcjonalny.
- *: Zero lub więcej (zero oznacza pusty ciąg).
- +: Jeden lub więcej.
- {n,m}: Dopasuj między n a m elementów.
Znak plus (+) i znak zapytania (?) nie działają z większością narzędzi Linuksa, chyba że użyjesz odpowiednich flag komend. Flagami zajmiemy się później.
Dopasuj Tyle Ile Chcesz Z Leniwymi i Chciwymi Kwantyfikatorami
Niektóre kwantyfikatory pozwalają nam zdefiniować nieokreśloną ilość. Na przykład znak plus (+) oznacza jeden lub więcej—cokolwiek większego od 0. Znak plus (+) i asterysk (*) są chciwe domyślnie, co oznacza, że próbują dopasować jak najwięcej. W przeciwieństwie do tego, możemy je uczynić leniwymi, aby dopasowywały jak najmniej.
Załączenie znaku zapytania (?) czyni je leniwymi. Na przykład, poniższe dopasuje a, b, lub z, ale zatrzyma się po pierwszym dopasowaniu (jest leniwe).
[abz]+?
Asterysk (*) jest metaznakiem, który jest podobny, z jedną małą różnicą: dopasowuje zero lub więcej elementów. Najbardziej leniwe dopasowanie to zero, więc poniższe nie dopasuje nic.
[abz]*?
Uczynienie kwantyfikatora leniwym może być bardziej wydajne, ponieważ nie musi przetwarzać całego ciągu. Jeśli przeszukujesz miliony ciągów, dopasowanie tylko pierwszych kilku znaków może zaoszczędzić wiele czasu i zasobów.
Kotwice Dopasowują Początek i Koniec Linii
Kotwice są proste do zrozumienia. Są dwie, jedna wskazuje początek linii (^) i jedna, która wskazuje koniec ($). Poniższy wzór dopasowuje foo dokładnie i nic innego:
^foo$
Modyfikatory: Flagi Które Zmieniają Jak Działa Regex
Modyfikatory to sposób na zmianę działania regexu. Na przykład, możemy uczynić go czułym na wielkość liter. Już przyjrzeliśmy się modyfikatorowi globalnemu, ale warto podkreślić, że są to flagi, które zazwyczaj znajdują się na końcu wyrażenia.
Modyfikator Globalny
Modyfikator globalny (g) pozwala regexowi kontynuować wyszukiwanie dopasowań po znalezieniu pierwszego, co skutkuje wieloma dopasowaniami. W przeciwieństwie do tego, wyłączenie modyfikatora globalnego powoduje, że regex zatrzymuje się po znalezieniu pierwszego dopasowania.
Modyfikator Czuliwości na Wielkość Liter
Modyfikator czuliwości na wielkość liter (i) dopasuje zarówno wielkie, jak i małe litery, gdy jest aktywny.
Modyfikator Wielowierszowy
Kotwice definiują początek (^) i koniec ($) ciągu. Gdy modyfikator wielowierszowy (m) jest aktywny, kotwice dopasowują początek i koniec każdej linii. Gdy jest nieaktywny, kotwice dopasowują cały ciąg.
Tak zachowują się kotwice, gdy tryb wielowierszowy jest aktywny:
^foo$ ^bar$
A gdy jest nieaktywny:
nieaktywny:
^foo bars$
Aby ocenić wszystkie linie, gdy modyfikator wielolinijkowy (m) jest aktywny, musisz także włączyć modyfikator globalny (g). Pamiętaj jednak, że spowoduje to również utworzenie wielu dopasowań.
Podsumowanie: Używanie wyrażeń regularnych z poleceniami
Teraz przyszedł czas na wielki finał: jak skutecznie wykorzystać to, czego się nauczyliśmy? Jak wspomniano na początku, find, fd, grep, ripgrep i sed obsługują wyrażenia regularne. Zwróć uwagę na flagi polecenia, które używam; wybrałem je, aby stosować podobne smaki.
Dla każdego polecenia użyję następującego wyrażenia:
^.+/[fo]+\.(jpg|png)$
Ten wzór dopasowuje ścieżkę POSIX dla pliku JPG lub PNG. Na przykład:
/foo/bar/baz/foo.jpg
To wyrażenie obejmuje wszystko, czego się nauczyliśmy: kotwice, klasy znaków, kwalifikatory, alternację, grupy dopasowań i metaznak DOTALL. Oto podsumowanie wyrażenia (w porządku występowania):
Segment | Notatka |
---|---|
^ | Dopasuj początek linii. |
.+ | Dopasuj dowolny znak, jeden lub więcej razy. |
/ | Dopasuj ukośnik tuż przed nazwą pliku. Ten dosłowny ukośnik definiuje wyraźną granicę dla naszej nazwy pliku, a poprzedni DOTALL dopasuje wszystkie inne znaki ścieżki (w tym ukośniki). |
[fo]+ | Dopasuj litery f i o jeden lub więcej razy, np. fo, foo, ffoo, fffooo, fofofof. |
\. | Dopasuj dosłowną kropkę (nie DOTALL). |
(jpg|png) | Grupa dopasowania; użyłem jej tutaj, aby zgrupować te dwa wzory razem. Pipe to alternacja i użycie go w ten sposób oznacza jpg lub png. |
$ | Dopasuj koniec linii. |
Dopasuję wszystkie wyrażenia do pliku (nazwanego examples) o następującej zawartości:
/foo/bar/baz/foo.jpg /one/two/thr/foo.png /this/should/not/match.jpg
Dla poleceń find stworzę takie pliki w moim systemie plików i będę ich szukał.
Używanie grep z wyrażeniami regularnymi
Aby użyć grep, musimy skorzystać z flagi -P, która włącza jego (ograniczony) silnik PCRE. PCRE jest najszerszym smakiem i obsługuje prawie wszystkie funkcje, jakich możesz się spodziewać.
Jeśli nie znasz grep, zapoznaj się z tym szczegółowym przewodnikiem, jak go używać.
Używanie find z wyrażeniami regularnymi
Polecenie find obsługuje wiele smaków wyrażeń regularnych. Możesz zobaczyć listę z nich za pomocą następującego polecenia:
find -regextype help
Smak, który najbliżej odpowiada PCRE, to posix-extended, znany również jako POSIX ERE (Rozszerzone Wyrażenia Regularne). POSIX ERE brakuje wielu zaawansowanych funkcji, ale obsługuje wszystkie funkcje, które omówiliśmy.
Jeśli to polecenie wydaje się zbyt długie, prawdopodobnie powinieneś użyć aliasu, aby ustawić opcje regex domyślnie.
Używanie fd z wyrażeniami regularnymi
Polecenie fd korzysta z pakietu regex Rust (pakiet Rust). Pakiet regex jest prawie kompatybilny z PCRE, więc możemy go używać bez większych obaw. Jednak domyślnie fd dopasowuje tylko nazwy plików, dlatego musimy użyć flagi --full-path, jeśli chcemy dopasować całą ścieżkę pliku.
Używanie ripgrep z wyrażeniami regularnymi
Używanie wyrażeń regularnych z poleceniem ripgrep jest proste, ponieważ korzysta z pakietu regex Rust. Jak wspomniano wcześniej, pakiet Rust blisko odpowiada PCRE.
Używanie sed z wyrażeniami regularnymi
Polecenie sed różni się od innych; pozwala nam wyszukiwać i zastępować ciągi. Jeśli nie znasz go, powinieneś zapoznać się z tym doskonałym przewodnikiem, jak używać polecenia sed. Ogólna forma polecenia jest następująca:
s/pattern/replacement/
Nie ma potrzeby używania ukośników, ponieważ możesz użyć dowolnego znaku, który chcesz. W poniższym przykładzie użyłem znaku pipe zamiast ukośników, aby nie mylić sed. Użycie pipe oznacza, że nie muszę uciekać od ukośników w podanej wartości zastępczej (ścieżce).
Dla sed musimy użyć smaku regex GNU ERE, co robimy za pomocą flagi -E. Wszystko, co działa w GNU ERE, działa również w PCRE, co jest dla nas korzystne.
W przykładzie wyodrębniłem wyniki i zastąpiłem.
Ścieżki plików, podobnie jak w przypadku komend cat i grep, ale sed wspiera również edytowanie w miejscu za pomocą flagi -i.
To tyle; to są podstawy regex. Podstawy pozwolą ci zajść bardzo daleko. Ważne jest, aby pamiętać, że wiele narzędzi używa różnych wersji regex, więc jeśli zejdźsz z wspomnianych flag, możesz odkryć, że niektóre funkcje nie działają.
Oprócz tego, regex to coś, na czym musisz się skupić, zanim naprawdę zacznie mieć sens. Możesz praktykować swoje umiejętności, zdobywać wiedzę i uczyć się więcej poprzez regex101, potężne internetowe środowisko, które zapewnia wskazówki i porady.
Jeśli ciekawią Cię artykuły podobne do Zwiększ swoją produktywność w terminalu Linux, ucząc się tej zaawansowanej składni wyszukiwania, zajrzyj do kategorii Linux i odkryj jeszcze więcej interesujących treści.
- Czym jest Regex?
- Różne Smaki Regex
- Szybki Przegląd Regexu, Aby Rozwiać Wszelkie Tajemnice
- Metaznak DOTALL: Dopasuj Wszystko i Wszędzie
- Klasy Znaków: Dopasuj Konkretne Znaki w Dowolnej Kolejności
- Grupy Dopasowujące: Rysuj Granice Wokół Podwyrażeń
- Kwantyfikatory: Jak Określić Dokładne i Zmienne Ilości
- Dopasuj Tyle Ile Chcesz Z Leniwymi i Chciwymi Kwantyfikatorami
- Kotwice Dopasowują Początek i Koniec Linii
- Modyfikatory: Flagi Które Zmieniają Jak Działa Regex
- Podsumowanie: Używanie wyrażeń regularnych z poleceniami
Dodaj komentarz
Możesz być zainteresowany