Regulární výrazy

Stránky: E-learning VŠCHT Praha
Kurz: Linux, shell
Kniha: Regulární výrazy
Vytiskl(a): Nepřihlášený host
Datum: neděle, 6. října 2024, 21.23

1. Regulární výrazy

Regulární výrazy (Regular Expressions - RE) jsou symbolické zápisy, které využívají speciálních znaků (metaznaků) k definici vzorů, které chceme najít v textu. V shellu je možné využít dva typy regulárních výrazů - základní regulární výrazy (Basic Regular Expressions - BRE) a rozšířené regulární výrazy (Extended Regular Expressions - ERE). Oba se liší v používané sadě metaznaků a ve významu a funkci některých z nich.


1.1. Základní regulární výrazy - BRE

Základní regulární výrazy (Basic Regular Expressions - BRE) využívají následující metaznaky ., *, ^, $, [, ]. Všechny ostatní znaky, které v definici BRE použijeme, jsou vnímány jako obyčejné znaky, tedy znaky bez speciálního významu či funkce.

Pro BRE platí jedno zásadní pravidlo. Pokud jsou metaznaky z ERE tzv. escapovány, tedy předchází jim únikový metaznak \, jsou chápané také jako metaznaky a dostávají svoji obvyklou funkci.

Význam a použití metaznaků viz kapitolu Význam metaznaků.


1.2. Rozšířené regulární výrazy - ERE

Rozšířené regulární výrazy (Extended Regular Expressions - ERE) využívají všechny metaznaky ze sady BRE, tedy metaznaky ., *, ^, $, [, ] a dále je tato sada rozšířena o metaznaky ?, +, {, }, (, ), |. Všechny ostatní znaky, které v definici ERE použijeme, jsou vnímány jako obyčejné znaky, tedy znaky bez speciálního významu či funkce.

Pro ERE platí jedno zásadní pravidlo. Pokud jsou metaznaky z ERE tzv. escapovány, tedy předchází jim únikový metaznak \, jsou chápané jako obyčejné znaky a ztrácí svoji obvyklou funkci.

Význam a použití metaznaků viz kapitolu Význam metaznaků.


2. Příkaz grep

Příkaz grep hledá v souborech nebo standardním vstupu řádky, které obsahují vzor zadaný pomocí regulárních výrazů. V základní podobě používá metaznaky BRE. Pomocí přepínače -E můžeme využít i metaznaky ERE, alternativně také pomocí příkazu egrep. Varianta příkazu fgrep, potlačí funkci všech metaznaků uvedených v regulárním výrazu.

Významné přepínače příkazu grep

přepínač význam
-i potlačí rozlišování velkých a malých písmen
-v zobrazí řádky, které neodpovídají zadanému vzoru
-n každé řádce s nalezeným vzorem přidá číslo
-c vrátí číslo počtu nalezených řádků
-l vrátí jména souborů, které obsahují zadaný vzor
-h potlačí výpis jmen souborů


3. Význam metaznaků

Příkaz grep lze v základní podobě použít s argumentem hledaného výrazu bez metaznaků. Jedná se o tzv. plain match, kdy dochází k vyhledání zadaného výrazu kdekoliv v každém řádku vstupu.



Metaznak ^ zajistí vyhledávání regulárního výrazu na začátku řádky.



Metaznak $ zajistí vyhledávání regulárního výrazu na konci řádky.



Metaznak . nahrazuje libovolný jeden znak.



Metaznaky [ ] slouží pro definici znaků a znakových tříd.

znaky
význam
[abc]
sada vybraných znaků
[^abc]
negace sady vybraných znaků, tzn. všechny ostatní než uvedené
[a-e]
sada znaků daná rozsahem
[^a-e]
negace sady znaků dané rozsahem, tzn. všechny ostatní než uvedený rozsah

znaková třída

význam
[:alpha:]
písmena [A-Za-z]
[:lower:]
malá písmena [a-z]
[:upper:]
velká písmena [A-Z]
[:digit:]
číslice [0-9]
[:alnum:]
alfanumerické znaky [A-Za-z0-9]
[:word:]
alfanumerické znaky a podtržítko [A-Za-z0-9_]
[:blank:]
mezera atabelátor [ \t]
[:space:]
  neviditelné znaky [ \t\r\n\v\f]
[:punct:]
  interpunkční znaménka [-!"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~]
[:xdigit:]
  hexadecimální číslice [A-Fa-f0-9]



Metaznaky ?, *, +, { } patří mezi tzv. kvantifikátory. Udávají počet výskytů předchozího uvedeného regulárního výrazu.

kvantifikátor význam
? výraz se nevyskytuje nebo maximálně jednou
* výraz se nevyskytuje nebo vícekrát
+ výraz se vyskytuje minimálně jednou
{n} výraz se vyskytuje přesně n-krát
{n,} výraz se vyskytuje minimálně n-krát
{,m} výraz se vyskytuje maximálně m-krát
{n,m} výraz se vyskytuje minimálně n-krát a maximálně m-krát



Metaznak | slouží pro alternaci více definovaných regulárních výrazů.



Metaznaky ( ) slouží pro definici skupin regulárních výrazů. Na jednotlivé skupiny se lze v rámci zadaného výrazu odkazovat pomocí tzv. zpětných referencí (back references), které jsou indexovány od čísla jedna v pořadí, jak jsou definovány jednotlivé skupiny regulárních výrazů. Indexu zpětné reference vždy předchází únikový metaznak (zpětné lomítko).



Metaznak \ je tzv. únikový metaznak. Slouží pro potlačení či vyvolání obvyklé funkce různých metaznaků (viz rozdíl mezi BRE a ERE v úvodu této kapitoly). Příkladem použití jsou výše uvedené ukázky s příkazy grep a egrep.