Regulární výrazy a program grep

 

 

Regulární výrazy:

 

-         slouží k hledání hodnot v řetězcích (ne pouhé srovnání)

-         znak ‚konec řádku‘ je standardně ignorován

-         využívají se ve více příkazech

-         tvoří je normální znaky a/nebo metaznaky:

         - základní: ^   $   .   *   \(   \)   [   \{   \}   \             ( expr, ex, vi, ed)
               - nadstandardní: |   ^   $   .   *   +   ?   (   )   [   {   }   \          (grep, sed – oba 
                                                                                                           s parametrem –E)
               - grep –E navíc ještě metaznaky \<   \>
 
Význam jednotlivých metaznaků:
 
.
zástupný znak pro jeden znak ve vstupní řádce
^
representuje začátek vstupní řádky (tj.  ^A  - text začínající znakem A)
$
representuje konec řádku (tj. A$ - text končící znakem A
[]
representuje regulární výraz (může to být jeden znak nebo část řetězce)
[^ …]
bude porovnávat všechny znaky , kromě výrazu v závorkách (doplněk)
[^-]
 
[^]
 
[= znak=]
bude porovnávat znaky které mají stejnou třídu jako znak. (tj. [=a=] bude porovnávat s ‘a‘  a ‘\(a:‘ a ‘\(a`‘ a v některých implementacích i ‘A‘)

[:třída:] 

 
bude nahrazovat třídu (skupinu) znaků. Jedná se o tyto třídy:

[:alpha:]  Znaky abecedy.

[:lower:]  Malé znaky.

[:upper:]  Velké znaky.

[:digit:]  Číslice.

[:alnum:]  Alfanumerické znaky (Sjednocení ‘aplha‘ a ‘digit‘ ).

[:space:]  Znaky ‘white space‘ (mezera, horizontální a vertikální tab.).

[:graph:]  Všechny tisknutelné znaky s výjimkou mezery.

[:print:]  Všechny tisknutelné znaky a mezera.

[:punct:]  Všechny tisknutelné znaky mimo znaků skupin ‘space‘ a

                ‘alnum‘.

            [:cntrl:]  Všechny netisknutelné znaky.
[zn1-zn2]
Interval znaků. (tj. [a-f]   - znaky ‘a‘ až ‘f‘ včetně)
\
Následující znak bude hledán v řetězci. (tj. \\ nebo \[ vstupní řetězec bude prohledáván na \ nebo [.
\d
representuje desítkovou cifru (1 až 9)
výraz*
Regulární výraz je opakován 0 a víckrát (tj. A* je null string, A, AA, AAA …)
výraz+
Regulární výraz je opakován minimálně jednou (tj. A+ je A, AA, AAA …)
výraz?
Regulární výraz je opakován jednou nebo ani jednou.

znak{n} 

znak\{n\} 

 
n je celé kladné číslo, které určuje počet opakování znaku. (tj. X\{3\} je XXX).

znak{min,} 

znak\{min,\} 

znak{min,max} 

znak\{min,max\} 

 

Znak je opakován minimálně min krát a maximálně max krát

výraz1|výraz2

Vstup je porovnán výrazem1 nebo výrazem2

(výraz1\(výraz2\)

Umožňuje slučovat výrazy (cíl: snížení specielních znaků)

\< \>

Identifikátor.
 
Podporované  metaznaky v programech:
 

Notation

awk

ed

egrep = grep -E

expr

gres

pg

sed

vi


.

^

 

$

[...]

[::]

 

re*

re+

 

 

 

 

re?

 

 

 

 

re|re

 

 

 

 

\d

(...)

 

 

 

 

\(...\)

 

 

 

 

\<

 

 

 

 

 

 

\>

 

 

 

 

 

 

\{ \}

 

 

 

{ }

 

 

 

 

 

 

 
Příklady:               

abc 

výstupem bude každá řádka, která bude obsahovat řetězec abc.

a.c 

výstupem bude každá řádka, která bude obsahovat řetězec složený ze znaků ‘a‘ následovaný libovolným znakem následovaný znakem ‘c‘

^.$ 

výstupem bude řádka, která bude obsahovat právě jeden znak (‘\n‘ bude ignorováno)

a(b*|c*)d 

výstupem bude každá řádka, která bude obsahovat řetězec složený z: ‘a‘ které bude následováno b nebo c, která budou opakována 0 a vícekrát a ukončen bude znakem ‘d‘

 

 

.* [a-z]+ .* 

výstupem bude řádka , která obsahuje slovo složené za znaků ‘a‘ až ‘z‘ a z každé strany je odděleno mezerou.

 (morty).*\1 

morty.*morty 

výstupem obou výrazů bude řádka obsahující nejméně 2 výskyty slova ‘morty‘

 [[:space:][:alnum:]] 

výstupem bude znak který bude buď ‘white space‘ nebo alfanumerický.

 

Příkaz grep:

syntaxe:

       grep [-[ABC] NUM] [-EFGHLUVZabchilnoqrsuvwxyz] [-e PATTERN

       | -f FILE] [-d ACTION] [--directories=ACTION] [--extended-

       regexp]  [--fixed-strings] [--basic-regexp] [--regexp=PAT-

       TERN]   [--file=FILE]   [--ignore-case]    [--word-regexp]

       [--line-regexp] [--line-regexp] [--no-messages] [--invert-

       match] [--version] [--help]  [--byte-offset]  [--line-num-

       ber]     [--with-filename]    [--no-filename]    [--quiet]

       [--silent] [--text] [--files-without-match] [--files-with-

       matches]  [--count]  [--before-context=NUM]  [--after-con-

       text=NUM] [--context[=NUM]]  [--binary]  [--unix-byte-off-

       sets] [--mmap] [--null] [--recursive] [file...]

 

- prohledává zadané vstupní soubory nebo standardní vstup na řádky, které odpovídají zadanému regulárnímu výrazu. Standardně vypíše řádky, které odpovídají.

 

- tři základní verze grepu:

       -G, --basic-regexp

              Akceptuje základní metaznaky (Pokud nebude zadán typ, bude vybrán tento)

       -E, --extended-regexp

               Akceptuje  nadstandardní metaznaky

       -F, --fixed-strings

               Interpretuje regulární výraz jako seznam fixních řetězců oddělených ‘\n‘

 

- existují i varianty programu grep tj. grep což je rovno grep –E a grep, což je rovno grep - F

 

- všechny varianty grepu akceptují tyto přepínače:

       -A NUM, --after-context=NUM

              Vypíše NUM řádek po vyhovující řádce

       -B NUM, --before-context=NUM

              Vypíše NUM řádek před vyhovující řádkou

       -C [NUM], --context[=NUM]

              Vypíše NUM řádek (standardně 2) výtupu.

 

       -V, --version

             Vypíše verzi grepu do standardního chybového výstupu.

       -b, --byte-offset

              Vypíše byte offset pře začátkem každé řádky

       -c, --count

               Vypíše počet řádek, které vyhovují regulárnímu výrazu

       -d ACTION, --directories=ACTION

               Pokud vstupním souborem je adresář, provede akci definovanou v ACTION.

               ACTION může být:

                               read – načte všechny soubory v adresáři

                               skip – přeskočí adresář

                               recurse – čte soubory (a adresáře) v adresáři rekurzivně       

       -e PATTERN, --regexp=PATTERN

Použije PATTERN jako regulární výraz pro porovnání řádků. Vhodné pro regulární výrazy začínající na ‘-‘. Může být definován více než jednou.

       -f FILE, --file=FILE

               Načte regulární výraz ze souboru.

       -H, --with-filename

              Vypíše název souboru pro každou shodu.

       -h, --no-filename

              Potlačí výpis názvu souboru při zpracování více souborů.

       -i, --ignore-case

              Ignoruje VELKÁ/malá písmena jak ve výrazu tak ve vstupu

       -L, --files-without-match

             Vypíše soubory, ve kterých nebyla ani jedna shoda.

       -l, --files-with-matches

               Vypíše soubory, ve kterých byla alespoň jedna shoda.

       -n, --line-number

              Vypíše před každou výstupní řádku její pořadové číslo.

       -o, --with-filename

              Vypíše název souboru před každou shodu.

       -q, --quiet, --silent

               Nic nevypisuje. Zastaví se na první shodě.

       -r, --recursive

              Čte všechny soubory (adresáře) rekurzivně.

       -a, --text

              V případě že se jedná o binární soubor, tak vypíše hlášku.

       -v, --invert-match

               Obrátí podmínku výběru tj. vybírá řádky, které nevyhovují reg. výrazu.

       -w, --word-regexp

Vybere pouze ty řádky, ve kterých byla shoda regulárním výrazem a bylo to celé slovo.

       -x, --line-regexp

              Pouze ty řádky které byly přesně (celé) jako regulární výraz.