Wyrażenia regularne umożliwiają nam m.in. selekcje linii w których znajduje się poszukiwany przez nas ciąg znaków. Linux dysponuje także poleceniami umożliwiającymi obliczanie długości ciągu znaków - polecenie expr - czy wyselekcjonowanie podciągu znaków z danego ciągu znaków (np. jak wyselekcjonować ZY z DGVHJZYNHKL ? ). W rozdziale zapoznamy się także z funkcjonowaniem tzw. wyrażeń zmiennych takich jak ## czy %%, które pozwalają skasować początek lub koniec ciągu znaków z których zbudowana jest zmienna. Rozdział kończy się przedstawieniem poleceń basename i dirname, których funkcja jest analogiczna do funkcji pełnionych przez wyrażenia ## i %%.
Polecenie expr
Polecenie expr pozwala wyselekcjonować podciąg znaków z ciągu znaków oraz oblicza długość danego ciągu znaków. Ogólna postać polecenia przedstawia się następująco:
→ Obliczanie długości ciągu znaków ←
expr [ ciąg znaków ] : ‘’.*’’
Przykłady:
$ expr ”piotr” : ”.*”
5
$ expr ”dzien dobry” : ”.*”
11
W ostatnim przykładzie polecenie expr liczy także spacje znajdującą się między „dzień” i „dobry” (spacje są też znakami, o czym często zapominają ci którzy zaczynają naukę informatyki i programowania).
$ expr ”ala ma kota” : ”.*”
11
→ Selekcja podciągu znaków ←
→ Wyrażenie \(…\) umożliwia selekcje podciągu znaków. Zastosujmy te wyrażenie na konkretnych przykładach. Najpierw zdefiniujmy zmienną pogoda:
$ pogoda=”jest bardzo zimno”
Selekcja dwóch pierwszych znaków:
$ expr ”$pogoda” : ”\(..\)”
je
Selekcja pieciu ostatnich znaków:
$ expr „”$pogoda” : „”.*\(…..\)”
zimno
→ Zdefiniujmy teraz zmienną której wartością będzie ciąg znaków zawierający /usr/bin/vi :
droga=/usr/bin/vi
$ expr „”$droga” : ”.*/\(.*\)”
$ expr „”$droga” : ”\(.*\)/”
Polecenia basename i dirname
Na wstępie zdefiniujmy zmienną która będzie zawierała ścieżkę dostępu do katalogu emacs.
$ droga=/usr/local/bin/emacs
$ basename $droga
emacs
$ dirname $droga
/usr/local/bin
Wyrażenia ## %%
Wyrażenia ## %% nazywane operatorami warunkowymi przypisania wartości zmiennej , pozwalają skasować początek lub koniec ciągu znaków które są symbolizowane przez jakąś zmienną. Ogólną postać wyrażeń ## i %%, można scharakteryzować w następujący sposób:
${nazwa_zmienna##wzorzec}
Z wartości zmiennej usuwany jest fragment odpowiadający wzorcowi dopasowanemu od lewej strony.
Symbol ## oznacza najdłuższy dopasowany fragment.
${nazwa_zmienna#wzorzec}
Z wartości zmiennej usuwany jest fragment odpowiadający wzorcowi dopasowanemu od lewej strony.
Symbol # oznacza najkrótszy dopasowany fragment.
${nazwa_zmienna%%wzorzec}
Z wartości zmiennej usuwany jest fragment odpowiadający wzorcowi dopasowanemu od prawej strony.
Symbol %% oznacza najdłuższy dopasowany fragment.
${nazwa_zmienna%wzorzec}
Z wartości zmiennej usuwany jest fragment odpowiadający wzorcowi dopasowanemu od prawej strony.
Symbol % oznacza najkrótszy dopasowany fragment.
Jak więc widzimy różnica pomiędzy operatorami ## , # i operatorami %% , % polega na tym z której strony ciągu znaków dopasowujemy wzorzec. Podajmy kilka przykładów, zdefiniujmy zmienną fic w następujący sposób:
$ fic=/usr/local/bin/emacs
Chcemy wyselekcjonować z zmiennej fic tylko ciąg znaków emacs:
$ echo ${fic##/*/}
emacs
Co się stanie jeżeli zamiast dwóch operatorów ## użyjemy tylko jednego # ?
$ echo ${fic#/*/}
local/bin/emacs
Czy rozumiesz dlaczego ?
→Wykonaj ćwiczenie z tą samą zmienną fic zmieniając operatory ## i # na %% i %. Jakie wyniki uzyskasz ?
Zdefiniujmy teraz zmienną user w następujący sposób:
$ user=`grep piotr /etc/passwd
$ echo $user
piotr:250::piotr jan:/home/piotr:/bin/bash
Chcemy wyselekcjonować – przy pomocy operatorów %% lub % - z ciągu znaków zawartych w zmiennej user ciąg znaków Piotr
$ echo S{user%%:*:}
piotr
Manipulowanie operatorami ## , # i %% , % świadczy o wysokich umiejętnościach programisty i jest niezbędne w pracy administratora systemu.
Programowanie Rozdział 9.5 Darmowy kurs Linux