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.