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ń  basenamedirname, 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