Zpět na blog

Použití Grep a Regex k vyhledávání textových vzorů

Použití Grep a Regex k vyhledávání textových vzorů

Příkaz grep je výkonný nástroj pro vyhledávání vzorů v textu. Je předinstalován v jakékoli distribuci Linuxu. Zde je náš návod, který se zabývá nastavením LAMP Stacku – Linux, Apache, MySQL a PHP.

Název grep znamená „global regular expression print“ (globální tisk regulárních výrazů). Tento nástroj vyhledává v zadaném vstupu specifikovaný vzor. V principu to zní triviálně. Jeho skutečná síla však spočívá v tom, jak definujete vzor. Tento průvodce podrobně popisuje, jak používat grep s regulárními výrazy k provádění složitých vyhledávání. Začněme!

Jak používat grep

Samotný příkaz grep není složitý. Vše, co vyžaduje, je vzor a obsah, ve kterém se má vyhledávat. Základní struktura příkazu grep vypadá takto:

Vyhledávání textu

Nejprve si pořiďte ukázkový soubor, na kterém akci provedete. Stáhněte si GNU General Public License v3.0 (v textovém formátu). Je to poměrně velký textový soubor s mnoha slovy a frázemi. Pokud používáte Ubuntu, najdete jej v souboru níže. Postupujte podle našeho návodu pro rychlou a snadnou instalaci Ubuntu.

download text file grep

Dále můžete provést základní vyhledávání textu pomocí příkazu grep:

grep text

Výstup příkazu je možné přesměrovat (pipe) do příkazu grep:

grep text
Rozlišování velikosti písmen

Ve výchozím nastavení grep rozlišuje velikost písmen. V mnoha situacích může být optimální velikost písmen ignorovat. Chcete-li zakázat rozlišování velikosti písmen, použijte přepínač „-i“ nebo „–ignore-case“:

grep ignore case
Inverzní vyhledávání

Ve výchozím nastavení grep vypisuje řádky, na kterých byl vzor nalezen. Inverzní shoda (invert match) označuje případ, kdy nechcete zobrazit řádky, které vzoru odpovídají. Chcete-li shodu invertovat, musíte použít přepínač „-v“ nebo „–invert-match“:

invert grep
Číslo řádku

Při spuštění příkazu grep na velmi velkém souboru je těžké sledovat umístění výsledku vyhledávání. Pro usnadnění práce má grep funkci zobrazení čísla řádku. Chcete-li povolit číslování řádků, použijte přepínač „-n“ nebo „–line-number“:

line number grep
Je možné kombinovat více argumentů příkazu grep. Následující příkaz grep provede inverzní vyhledávání a zároveň vypíše čísla řádků:

combine arguments of grep

Regulární výraz

Na začátku této příručky jsme zmínili, že grep znamená „global regular expression print“. Pojem „regulární výraz“ je definován jako speciální řetězec, který popisuje vyhledávací vzor. Regulární výraz má svou vlastní strukturu a pravidla.

Existuje celá řada algoritmů a nástrojů pro vyhledávání řetězců, které k vyhledávání a nahrazování používají regulární výrazy (zkráceně regex). Přestože jsou populární, různé aplikace a programovací jazyky implementují regex mírně odlišně. V této části si ukážeme několik metod regexu pomocí příkazu grep.

Doslovná shoda

V předchozích příkladech prováděl grep vyhledávání konkrétního řetězce v daném textovém souboru. Grep ve skutečnosti vyhledával pomocí velmi základního regulárního výrazu. Vzory regexu, které definují vyhledávání přesné shody daného řetězce, se nazývají „literály“. Název pochází ze skutečnosti, že odpovídají vzoru doslovně, znak po znaku.

Doslovná shoda funguje s abecedními a číselnými znaky (stejně jako s některými speciálními znaky). V závislosti na jiných mechanismech výrazů se však toto chování může změnit:

literal matching grep

Shoda s ukotvením

Kotvy jsou speciální znaky, které definují, kde v řádku by se měla nacházet pozice shody, aby byla shoda platná. Zde je rychlý příklad pro zjednodušení. Pokud chceme najít pouze řádky, které začínají řetězcem „GNU“, pak bude grep s regulárním výrazem vypadat takto. Zde je znak „^“ kotvou, která definuje, že jediné platné shody jsou ty na začátku řádku:

anchor match regexp

Podobně, pokud chceme najít pouze řádky, které končí řetězcem „works“, bude grep s regulárním výrazem vypadat takto. Zde je znak „$“ kotvou, která definuje, že platné jsou pouze shody na konci řádku:

anchor matching regexp

Shoda s libovolným znakem

Při vyhledávání textu můžete chtít definovat, že na určitém místě může být libovolný znak. V regulárních výrazech je to vyjádřeno znakem tečky (.).

Podívejte se na tento příklad. V textovém souboru GNU GPL 3 mají slova „accept“ a „except“ společnou část „cept“. Obě slova mají navíc před částí „cept“ dva znaky. Následující příkaz grep najde shodu s jakýmkoli slovem, které má před částí „cept“ dva znaky:

any character match grep

Podle tohoto regulárního výrazu jsou platnými shodami také další slova jako suscept, unaccept, unexpected atd.

Hranaté závorky

V regulárních výrazech definují výrazy v hranatých závorkách, že na zadaném místě může být jakýkoli znak deklarovaný uvnitř závorky. Podívejte se na následující řetězec regulárního výrazu:

Při použití v praxi budou platnými shodami slova too a two:

bracket regexp

Výraz v hranatých závorkách otevírá možnosti pro zajímavé věci. Pomocí výrazů v hranatých závorkách lze říci, že na zadaném místě může být jakýkoli jiný znak než ty, které jsou deklarovány uvnitř závorky. Podívejte se na následující řetězec regulárního výrazu. Shoda bude platná pouze tehdy, pokud je před „ode“ jakýkoli jiný znak než „c“:

Spusťte jej na textovém souboru s licencí GPL-3:

bracket regexp

Kromě výsledku ze souboru by dalšími platnými výsledky byly node, abode, anode atd. Výrazy v hranatých závorkách mohou také popisovat rozsah znaků. Následující regulární výraz říká, že shoda je platná, pokud je na začátku řádku velké písmeno:

Spusťte jej na textovém souboru s licencí GPL-3. Budou to všechny řádky v textovém souboru:

bracket regexp

Pro snadnější použití existují určité třídy znaků, které mají specifická označení. V předchozím příkladu jsme k definování velkých písmen použili rozsah „A-Z“. Místo toho můžeme použít také „[:upper:]“. Výsledek bude stejný:

Opakování vzoru

V určitých situacích můžete chtít najít shodu pro konkrétní vzor nebo regulární výraz nulakrát nebo vícekrát. K tomu slouží metaznak hvězdička (*). Následující regulární výraz najde shodu se všemi závorkami, které obsahují pouze písmena a jednoduché mezery mezi nimi. Všimněte si, že deklarace sad malých a velkých písmen a mezer jsou společně bez jakékoli interpunkce:

Uveďte regulární výraz do praxe pomocí grep:

repeating pattern
Použití metaznaků jako doslovných znaků

Dosud jsme se seznámili s různými metaznaky, jako je hvězdička (*), tečka (.), ukotvení (^ a $), atd. Každý z nich označuje jedinečnou funkci v kontextu regulárních výrazů. Problém nastává, když je potřeba je použít jako literály, nikoli jako metaznaky. V takových situacích zpětné lomítko (\) před metaznakem označuje, že se má použít v doslovném smyslu, nikoli jako metaznak. Podívejte se na tento příklad regulárního výrazu. Vyhledá všechny řádky, které začínají velkým písmenem a končí tečkou:

meta character regexp
Alternace

Pomocí závorkových výrazů můžeme specifikovat různé možné volby pro shodu jednoho znaku. Regulární výrazy mají funkci dělat totéž se slovy a frázemi. K označení alternace se používá znak svislé čáry (|). Možnosti zůstávají v závorkách, zatímco svislá čára je od sebe odděluje. Pro platnost shody mohou existovat dvě nebo více možných možností. Podívejte se na následující příklad regulárního výrazu. Bude odpovídat jak „GPL“, tak „General Public License“:

alternate choices of grep
Kvantifikátory

Pomocí metaznaku hvězdičky (*) jsme byli schopni definovat vzor opakovaně nulkrát nebo vícekrát. Je toho však k práci více. Kvantifikátory je snazší vysvětlit na příkladu. Následující regulární výraz popisuje, že jak „copyright“, tak „right“ jsou platné shody. Otazník (?) označuje část „copy“ jako volitelnou pro shodu:

quantifiers regexp

Dalším kvantifikátorem je symbol plus (+). Chová se podobně jako hvězdička. Definovaný vzor se však musí shodovat alespoň jednou. V následujícím příkladu bude regulární výraz odpovídat slovu „soft“ s jedním nebo více nebílými znaky:

Určení opakování shody

Je možné určit, kolikrát se má shoda opakovat. K tomu použijte složené závorky ({}). Následující regulární výraz vyhledá jakékoli slovo, které obsahuje minimálně tři samohlásky:

match repetition regexp

Tato funkce také umožňuje definovat dolní a horní hranici délky shody. V následujícím příkladu bude regulární výraz odpovídat jakémukoli slovu o délce 10–15 znaků:

match repetition regexp

Závěr

Vyhledávání v textových souborech pomocí grep je docela praktické. Regulární výrazy dělají vyhledávání pomocí grep zajímavějším a užitečnějším. Také doladí vyhledávací vzor podle vašich představ.

Ačkoli jsme si ukázali některé z běžných regulárních výrazů, je to jen začátek. Existují pokročilejší regulární výrazy, které nabízejí tu nejjemnější kontrolu nad chováním při vyhledávání. Kromě nástroje grep jsou regulární výrazy široce používány také dalšími nástroji a programovacími jazyky.

Příjemnou práci s počítačem!

 

author

Akshay Nagpal

Autor · CloudSigma

Preslav Dobrev je kreativní designér ve společnosti CloudSigma, který se zaměřuje na konzistentní firemní identitu prostřednictvím tradičních i inovativních marketingových kanálů. Je zdatný v propojování umělecké vize se strategickým marketingem za účelem vytváření působivých příběhů značky.

Komentáře

Zatím žádné komentáře. Buďte první.