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

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:

KoncepcjaOpis
Klasy znakówLista konkretnych znaków, które chcesz dopasować, np. [abc].
Grupy dopasowująceNawiasy wokół powiązanych części wyrażenia, jak nawiasy w matematyce, np. (foo).
ModyfikatoryZmieniają, jak działa wyrażenie, np. wrażliwość na wielkie litery.
KotwiceDefiniują początek i koniec ciągu, np. ^foo$.
KwantyfikatoryWskazują ilość, np. foo+, foo{3} itd.
AlternatywaPo prostu zdanie or, np. foo|bar.
Metaznak DOTALLDopasowuje 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):

SegmentNotatka
^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.

Indeks
  1. Czym jest Regex?
  2. Różne Smaki Regex
  3. Szybki Przegląd Regexu, Aby Rozwiać Wszelkie Tajemnice
  4. Metaznak DOTALL: Dopasuj Wszystko i Wszędzie
  5. Klasy Znaków: Dopasuj Konkretne Znaki w Dowolnej Kolejności
  6. Grupy Dopasowujące: Rysuj Granice Wokół Podwyrażeń
  7. Kwantyfikatory: Jak Określić Dokładne i Zmienne Ilości
    1. Dopasuj Zero lub Więcej Rzeczy Z Asteryskiem
    2. Dopasuj Jedną lub Więcej Rzeczy Z Znakiem Plus
    3. Spraw, Aby Rzeczy Były Opcjonalne Z Znakiem Zapytania
    4. Określ Dokładne Ilości Z Ramkami Klamrowymi
    5. Podsumowanie Kwantyfikatorów
  8. Dopasuj Tyle Ile Chcesz Z Leniwymi i Chciwymi Kwantyfikatorami
  9. Kotwice Dopasowują Początek i Koniec Linii
  10. Modyfikatory: Flagi Które Zmieniają Jak Działa Regex
    1. Modyfikator Globalny
    2. Modyfikator Czuliwości na Wielkość Liter
    3. Modyfikator Wielowierszowy
  11. Podsumowanie: Używanie wyrażeń regularnych z poleceniami
    1. Używanie grep z wyrażeniami regularnymi
    2. Używanie find z wyrażeniami regularnymi
    3. Używanie fd z wyrażeniami regularnymi
    4. Używanie ripgrep z wyrażeniami regularnymi
    5. Używanie sed z wyrażeniami regularnymi

Możesz być zainteresowany

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Go up