Bez względu na to, czy szukałeś z Grepem, czy też korzystasz z programów, które mogą grupować pliki z nazwami, prawdopodobnie zastanawiałeś się, czy istnieje łatwiejszy sposób na wykonanie swojej pracy. Na szczęście jest i nazywa się "wyrażeń regularnych".
(Komiks z XKCD.com)
Wyrażenia regularne to sformułowania sformułowane w bardzo specyficzny sposób i mogące przynieść wiele różnych wyników. Znane również jako "regex" lub "regexp", są używane przede wszystkim w funkcjach wyszukiwania i nazywania plików. Jeden regex może być użyty jak formuła, aby utworzyć wiele różnych możliwych wyjść, z których wszystkie są wyszukiwane. Alternatywnie możesz określić, jak grupa plików powinna być nazwana, podając wyrażenie regularne, a twoje oprogramowanie może stopniowo przejść do następnego zamierzonego wyjścia. W ten sposób możesz łatwo i skutecznie zmieniać nazwy wielu plików w wielu folderach i możesz wyjść poza ograniczenia prostego systemu numerowania.
Ponieważ użycie wyrażeń regularnych opiera się na specjalnej składni, Twój program musi być w stanie odczytać i przeanalizować je. Wiele programów do zmiany nazw plików w systemach Windows i OS X obsługuje obsługę wyrażeń regularnych, a także wieloplatformowe narzędzie do wyszukiwania GREP (które wymieniliśmy w naszym przewodniku Bash Scripting for Beginners Guide) oraz narzędzie wiersza polecenia Awk dla * Nix. Ponadto wiele alternatywnych menedżerów plików, programów uruchamiających i narzędzi do wyszukiwania korzysta z nich i mają one bardzo ważne miejsce w językach programowania takich jak Perl i Ruby. Inne środowiska programistyczne, takie jak .NET, Java i Python, a także nadchodzące C ++ 11, zapewniają standardowe biblioteki do korzystania z wyrażeń regularnych. Jak możesz sobie wyobrazić, mogą być bardzo przydatne, gdy próbujesz zminimalizować ilość kodu umieszczanego w programie.
Zanim pokażemy Ci przykłady, chcielibyśmy wskazać coś. Zamierzamy użyć powłoki bash i polecenia grep, aby pokazać, jak stosować wyrażenia regularne. Problem polega na tym, że czasami chcemy używać znaków specjalnych, które muszą zostać przekazane do grep, a powłoka bash zinterpretuje ten znak, ponieważ powłoka również go używa. W tych okolicznościach musimy "uciec" od tych postaci. Może to być mylące, ponieważ to "ucieczkowe" znaków występuje również w regexpach. Na przykład, jeśli chcemy wprowadzić to w grep:
\<
musimy zastąpić to:
\\\<
Każda postać specjalna otrzymuje tu jeden ukośnik odwrotny. Możesz też użyć pojedynczych cudzysłowów:
'\<'
Pojedyncze cytaty mówią bashowi NOT, aby nie interpretował tego, co w nich jest. Chociaż wymagamy podjęcia tych kroków, abyśmy mogli Ci to pokazać, twoje programy (zwłaszcza oparte na GUI) często nie wymagają tych dodatkowych kroków. Aby zachować prostotę i prostotę, rzeczywiste wyrażenie regularne zostanie ci podane jako cytowany tekst, a zobaczysz zignorowaną składnię ze zrzutów ekranu wiersza poleceń.
Regeksy to naprawdę zwięzły sposób określania terminów, dzięki czemu komputer może rozwinąć je w wiele opcji. Rzućmy okiem na następujący przykład:
tom [0123456789]
Kwadratowe nawiasy - [i] - powiedz procesorowi, że cokolwiek jest w środku, każda JEDNEGO znaku może być użyta do dopasowania. Cokolwiek znajduje się w tych nawiasach, nazywa się zestawem znaków.
Gdybyśmy mieli ogromną listę wpisów i użyliśmy tego wyrażenia regularnego do przeszukania, dopasowalibyśmy następujące terminy:
i tak dalej. Jednak poniższa lista NIE byłaby dopasowana, więc NIE pojawiłaby się w wynikach:
Możesz również wybrać opcję wyszukiwania z kropką (.), Która pozwoli na obecność dowolnego postaci, o ile obecny jest znak.
Jak widać, siadając z
.Tomek
nie wywołał terminów, które na początku miały tylko "tom". Pojawiły się nawet "zielone pomidory", ponieważ przestrzeń przed "tomem" liczy się jako postać, ale określenia takie jak "tomF" nie miały początkowej postaci i dlatego zostały zignorowane.
Uwaga: domyślnym zachowaniem Grepa jest zwrócenie całego wiersza tekstu, gdy jakaś część pasuje do Twojego wyrażenia regularnego. Inne programy mogą tego nie robić i możesz to wyłączyć w grep z flagą "-o".
Możesz również określić naprzemienność za pomocą potoku (|), jak tutaj:
speciali (s | z) e
Znajdzie to zarówno:
Używając polecenia grep, musimy uciec od znaków specjalnych (, |, i) za pomocą ukośników odwrotnych, a także użyć flagi "-E", aby to zadziałało i uniknąć brzydkich błędów.
Jak wspomniano powyżej, jest tak dlatego, że musimy powiedzieć powłoce Bash, aby przekazać te znaki do grep i nie robić nic z nimi. Flaga "-E" mówi grep, aby używał nawiasów i potoku jako znaków specjalnych.
Możesz wyszukiwać według wykluczenia za pomocą karetki, która znajduje się zarówno w nawiasach kwadratowych, jak i na początku zestawu:
tom [^ F | 0-9]
Ponownie, jeśli używasz grep i bash, pamiętaj, aby uciec z tej fajki!
Warunki, które były na liście, ale NIE pojawiały się to:
Te nie pasowały do naszego wyrażenia regularnego.
Często szukamy w oparciu o granice. Czasami chcemy tylko ciągów, które pojawiają się na początku słowa, na końcu słowa lub na końcu linii kodu. Można to łatwo zrobić za pomocą tego, co nazywamy kotwicami.
Korzystanie z karetki (poza nawiasami) pozwala wyznaczyć "początek" linii.
^ tom
Aby wyszukać koniec linii, użyj znaku dolara.
tom $
Możesz zobaczyć, że nasz łańcuch wyszukiwania przychodzi PRZED kotwicą w tym przypadku.
Możesz także dopasowywać, które pojawiają się na początku lub końcu słów, a nie całe linie.
\<>
tom \>
Jak wspomnieliśmy w notatce na początku tego artykułu, musimy uciec z tych znaków specjalnych, ponieważ używamy basha. Możesz też użyć pojedynczych cudzysłowów:
Wyniki są takie same. Upewnij się, że używasz pojedynczych cudzysłowów, a nie podwójnych cudzysłowów.
Dopadliśmy tylko wierzchołka góry lodowej. Możesz także wyszukiwać terminy pieniężne określone przez znacznik waluty i wyszukiwać dowolne z trzech lub więcej pasujących haseł. Rzeczy mogą się bardzo skomplikować. Jeśli chcesz dowiedzieć się więcej na temat wyrażeń regularnych, zapoznaj się z następującymi źródłami.
Możesz również budować i testować swoje wyrażenia regularne za pomocą bezpłatnego narzędzia online o nazwie RegExr opartego na technologii Flash. Działa tak, jak piszesz, jest bezpłatny i może być używany w większości przeglądarek.
Czy korzystasz z ulubionych wyrażeń regularnych? Znasz świetny renaser wsadowy, który je wykorzystuje? Może po prostu chcesz się pochwalić swoim grep-fu. Przekaż swoje myśli komentując!