Skip to main content

8.1 Wyrażenia Regularne – polecenia grep, sed , find

 

Wyrażenia regularne są podstawą konstrukcji systemu Unix i Linux a także wielu języków programowania takich jak  „awk”, „Perl” czy „PHP”. Dlatego też warto się z nimi zaznajomić gdyż wbrew pozorom ich opanowanie nie jest zbyt trudne. Przedstawię tzw. podstawowe symbole wyrażenia regularne (BRE- Basic Regular Expression) oraz rozszerzone wyrażenia regularne (ERE- extender Regular Expressions).

Odkrycie wyrażeń regularnych związane jest z pierwszymi teoretycznymi pracami nad opisowymi językami symbolicznymi prowadzonymi przez matematyka Stephen Kleene (1909-1994). Sformułował on pierwszy założenia umożliwiające zdefiniowanie tzw. zbiorów regularnych, wykorzystanych początkowo do przekazywania w sieciach neuronów informacji, a następnie zastosowanych do budowy kompilatorów. Trzeba jednak podkreślić, że wyrażenia regularne mają zastosowanie także poza informatyką; stosuje się je w lingwistyce do tzw. analizy tekstowej oraz do definiowania praw w gramatyce teoretycznej; w biologii do odszyfrowania sekwencji ludzkiego genomu, w neurologii; w elektronice do modelizacji obwodów elektrycznych itd. Interdyscyplinarny aspekt wyrażeń regularnych jest szczególnie ważny w procesie nauczania. Spróbujmy odpowiedzieć na pytanie: dlaczego praktyczne poznanie wyrażeń regularnych jest tak ważne nie tylko dla informatyków, ale także np. dla tych, którzy zajmują się przerabianiem, wyszukiwaniem - w Internecie - informacji? Aby przybliżyć czytelnikowi problem przedstawiony w tym rozdziale wyobraźmy sobie następującą sytuacje: jakiś autor zredagował tekst, którego kolejne rozdziały ponumerował w następujący sposób:

1-1,    1-2,    1-3, itd.

 

i chce następnie zmienić formę ich numeracji na: 

§ 1.1,   § 1.2,    § 1.3.

 

Wyszukanie i zmienienie nazw rozdziałów wymaga przejrzenia całego tekstu co wiąże się z utratą sporej ilości czasu i zmęczeniem, a więc możliwością popełnienia błędu. Wyrażenia regularne – czasami nazywane wyrażeniami racjonalnymi – dostarczają nam reguł, które umożliwiają zdefiniowanie symboliczne tego czego szukamy, w tym wypadku liczby po której następuje myślnik po którym znów następuje liczba. Wyrażenie typu:

1-1,    1-2,    1-3, itd.

 

jest wyrażeniem znakowym (lub literalnym) . Natomiast wyrażenie typu \d-\d jest opisem abstrakcyjnym w/w wyrażeń znakowych, \d jest konwencją używaną w wyrażeniach regularnych do oznaczenia zbioru liczb całkowitych 0-9. Jednak jeśli numer rozdziału będzie większy od 9  np. 10-1 lub 1-10 to wyrażenie regularne \d-\d go nie odnajdzie, dlatego też musimy je uogólnić na wszystkie liczby całkowite. W tym celu po literze d dorzucamy znak + , który oznacza "wyszukaj jedną lub wiele liczb zawartych w zbiorze 0-9" , otrzymujemy zapis:

\d+-\d+

 

spełniający wymogi naszego uogólnienia. Tak więc w przeciwieństwie do ciągu literalnego typu 1-1, 100, abcd, FBR, wyrażenia regularne mogą w sposób abstrakcyjny przedstawić dowolny ciąg znaków. Oto kilka typowych sytuacji w których symbole wyrażeń regularnych są często używane:

- wyszukanie określonego ciągu znaków – np. w tekście dotyczącym chemii organicznej odnalezienie wszystkich terminów zaczynających się przedrostkiem ortho lub w spisie plików znalezienie tych, które kończą się na .doc

- zmiana tekstu w stronice Internetową

- zmiana w tekście formy pewnych słów np. dużo-literowych na mało-literowe lub odwrotnie

- analiza prawomocności wartości przekazanej: np. oczekujemy, że użytkownik wystuka na klawiaturze adres elektroniczny lub liczbę o szczególnej formie: wyrażenie regularne umożliwi wykrycie błędu

- przeformowanie ustrukturalizowanego tekstu: np. bibliograficzna baza danych przedstawiona jest w formie, którą chcemy zmienić umiejscawiając datę publikacji po nazwisku autora a nie po tytule jak było dotychczas.

 

Przedstawię teraz tzw. podstawowe symbole wyrażenia regularne (BRE , Basic Regular Expression)

. kropka: odpowiada dowolnemu pojedynczemu znakowi z wyjątkiem znaku przedstawiającego koniec linii – np. wyrażenie regularne b.l przedstawia zarówno słowo bal jak bol jak i każdą inną kombinacje typu  bel,   bil,   bpl, etc

[ ] pozwala dopasować dowolny znak ze zbioru zawartego między nawiasami, wszystkie znaki występujące między nawiasami mają zwykłe znaczenie oprócz myślnika - , który jest używany do tworzenia zakresu znaków n.p [a-z] oznacza każdą małą literę alfabetu. Znak  ^ , który umiejscowiony na początku nawiasów [^  ] wyznacza negacje zbioru zdefiniowanego między nawiasami n.p   [^0-9] oznacza wszystkie znaki oprócz 0,1,2,3,4,5,6,7,8,9 etc

gwiazdka dopasowuje zero lub więcej wystąpień znaków poprzedzających *. Zwracamy uwagę, że gwiazdka w wyrażeniach regularnych ma inne znaczenie niż gwiazdka w  generowaniu nazwy plików, w tym przypadku * oznacza dowolnie długi – także pusty – ciąg różnych znaków. W wyrażeniach regularnych dowolny ciąg dowolnych znaków zapisujemy jako .*

^ akcent w formie daszka wskazuje, że ciąg znaków występujący po nim znajduje się na początku linii.

$ dolar jest przeciwieństwem ^ i wskazuje, że ciąg znaków, który go bezpośrednio poprzedza znajduje się na końcu wiersza

\ neutralizuje znaczenie znaku specjalnego np. \$ będzie oznaczał znak dolara $ a nie znak wyrażenia regularnego wskazującego, że ciąg znaków go poprzedzający znajduje się na końcu wiersza

[^  ]  dopasowuje dowolny znak, który nie znajduje się w nawiasach. Znak ^ działa jak operator dopełnienia dla zbioru lub klasy znaków. Na przykład [^0-9] oznacza wszystkie znaki, które nie są cyframi

\\  puste wyrażenie regularne, które przyjmuje wartość ostatniego wyrażenia regularnego

\ ( wyrażenie regularne\) 

 

 

Wyrażenia Regularne Darmowy kurs Linux

  • Utworzono .
  • Kliknięć: 27063