GNU/Linux >> Znalost Linux >  >> Linux

Regulární výrazy:Stahování všeho dohromady

V Představení regulárních výrazů , představil jsem koncept a základy a poté v části Začínáme s regulárními výrazy:příklad , prošli jsme příkladem, který čistí seznamy jmen a e-mailových adres, aby byly konzistentní a analyzovatelné. Po našem ponoru do Regex a grep:Datový tok a stavební bloky , kde jsme se podrobněji zabývali regulárními výrazy, je nyní čas prozkoumat způsoby, jak zkrátit a zjednodušit program příkazového řádku z prvního příkladu. Zde se zaměříme na grep a sed .

Příklad:Zjednodušení programu konference

Nejprve se podívejme zpět na náš první příklad, kde jsme vytvořili následující program rozhraní příkazového řádku (CLI):

cat Experiment_6-1.txt | grep -v Team | grep -v "^\s*$" | sed -e "s/[Ll]eader//" -e "s/\[//g" -e "s/]//g" -e "s/)//g" -e "s/(//g" | awk '{print $1" "$2" <"$3">"}'

Pravidelné výrazy se vám v tomto okamžiku mohou číst snadněji, ale tento program lze zjednodušit.

kočka a grep

Začněme tím, že se zaměříme na začátek příkazu, který zahrnuje cat a grep :

cat Experiment_6-1.txt | grep -v Team | grep -v "^\s*$"

Můžeme kombinovat dva grep výpisy, které původně vypadají takto:

| grep -v Team | grep -v "^\s*$" 

Tip: Když STDOUT z grep není přenášen přes jiný nástroj a při použití emulátoru terminálu, který podporuje barvy, jsou ve výstupním datovém toku zvýrazněny shody regulárních výrazů.

Upravený příkaz je:

grep -vE "Team|^\s*$"

Zde jsme přidali E možnost, která určuje rozšířený regulární výraz. Podle grep manuálová stránka:

"V GNU grep není žádný rozdíl v dostupných funkcích mezi základní a rozšířenou syntaxí."

Toto tvrzení není striktně pravdivé, protože náš nový kombinovaný výraz bez E selže volba. Chcete-li zobrazit výsledky, spusťte následující:

[student@studentvm1 testing]$ cat Experiment_6-1.txt | grep -vE "Team|^\s*$"

Zkuste to bez E možnost.

Nyní se podívejme na cat . grep nástroj umí také číst data ze souboru, takže můžeme eliminovat cat celý příkaz:

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt

Tato a předchozí změna nám společně zanechávají následující, poněkud zjednodušený program CLI:

grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/\[//g" -e "s/]//g" -e "s/)//g" -e "s/(//g" | awk '{print $1" "$2" <"$3">"}'

Tento příkaz je kratší, stručnější a bude se provádět rychleji, protože grep stačí analyzovat datový tok jednou.

Poznámka: Opět je důležité si uvědomit, že toto řešení není jediné. V Bash existují různé metody pro vytváření stejného výstupu a existují i ​​​​jiné jazyky, jako je Python a Perl, které lze také použít. A samozřejmě vždy existují makra LibreOffice Writer. Ale vždy se mohu spolehnout na Bash jako součást jakékoli distribuce Linuxu. Tyto úkoly mohu provádět pomocí programů Bash na jakémkoli počítači se systémem Linux, dokonce i na počítači bez grafického uživatelského rozhraní nebo na počítači, který má pracovní plochu s grafickým rozhraním, ale nemá nainstalovaný LibreOffice.

sed

Můžeme také zjednodušit sed příkaz. sed nástroj nejen umožňuje vyhledávat text, který odpovídá vzoru regulárního výrazu, může také upravit, odstranit nebo nahradit odpovídající text. Používám sed na příkazovém řádku a ve skriptech prostředí Bash jako rychlý a snadný způsob, jak najít text a upravit jej. Název sed je zkratka pro stream editor, protože pracuje s datovými proudy stejným způsobem jako jiné nástroje, které mohou transformovat datový proud. Většina těchto změn zahrnuje výběr konkrétních vedení z datového toku a jejich předání jinému transformačnímu programu.

Poznámka: Mnoho lidí nazývá nástroje jako grep filtrační programy , protože odfiltrují nežádoucí řádky z datového toku. Preferuji termín transformátory , protože nástroje jako sed a awk dělat víc než jen filtrovat. Mohou testovat obsah pro různé kombinace řetězců a upravovat odpovídající obsah mnoha různými způsoby. Nástroje jako sort , head , tail , uniq , fmt a další všechny nějakým způsobem transformují datový tok.

sed jsme již viděli v akci, ale nyní, s porozuměním regulárním výrazům, můžeme lépe analyzovat a porozumět našemu dřívějšímu použití. Je možné kombinovat čtyři z pěti výrazů používaných v sed příkaz do jediného výrazu. sed příkaz má nyní dva výrazy místo pěti:

sed -e "s/[Ll]eader//" -e "s/[]()\[]//g"

Tento formát trochu ztěžuje pochopení složitějšího výrazu. Všimněte si, že bez ohledu na to, kolik výrazů má jeden sed obsahuje, je datový proud analyzován pouze jednou, aby odpovídal všem výrazům.

Podívejme se blíže na revidovaný výraz:

-e "s/[]()\[]//g"

Ve výchozím nastavení sed interpretuje všechny [ znaky jako začátek sady a poslední ] znak jako konec této sady. Takže ve výše uvedeném kódu je první [ a poslední ] obsahovat sadu. Zasahující ] znaky nejsou interpretovány jako metaznaky.

Protože potřebujeme shodu [ jako doslovný znak, aby se odstranil z datového toku, a sed normálně interpretuje [ jako metaznak jej musíme ukončit, aby byl interpretován jako doslovný ] . Zde je zpětné lomítko (\ ) přichází a dává nám \[ uprostřed.

Pojďme tuto novou verzi zapojit do skriptu CLI a otestovat ji:

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[]()\[]//g"

Vím, na co se ptáte:„Proč neumístit \[ za [ který otevře sadu, a před ] postava?" Zkuste to jako já:

[student@studentvm1 testing]$  grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[\[]()]//g"`

Myslím, že by to mělo fungovat, ale nefunguje. Malé neočekávané výsledky, jako je tento, jasně ukazují, že musíme být opatrní a pečlivě testovat každý regulární výraz, abychom se ujistili, že skutečně dělá to, co zamýšlíme.

Po nějakém vlastním experimentování jsem zjistil, že uniklá levá hranatá závorka \[ funguje dobře ve všech pozicích výrazu kromě první. Toto chování je zaznamenáno v grep manuálovou stránku, kterou jsem si pravděpodobně měl přečíst jako první. Zjistil jsem však, že experimentování posiluje věci, které čtu, a obvykle objevím zajímavější věci, než jsem hledal.

Přidání poslední komponenty, awk náš optimalizovaný program vypadá takto a výsledky jsou přesně takové, jaké chceme:

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[]()\[]//g" | awk '{print $1" "$2" <"$3">"}'

Další nástroje, které implementují regulární výrazy

Mnoho nástrojů Linuxu implementuje regulární výrazy. Většina těchto implementací je velmi podobná implementaci awk , grep a sed , takže by mělo být snadné naučit se rozdíly. Ačkoli jsme se podrobně nezabývali awk, je to výkonný jazyk pro zpracování textu, který také implementuje regulární výrazy.

Většina pokročilejších textových editorů používá regulární výrazy. Vim, gVim, Kate a GNU Emacs nejsou žádnou výjimkou. less nástroj implementuje regulární výrazy, stejně jako vyhledávací a nahrazovací nástroj LibreOffice Writer.

Programovací jazyky jako Perl, awk a Python také obsahují implementace regulárních výrazů, díky čemuž jsou vhodné pro psaní nástrojů pro manipulaci s textem.

Zdroje

Našel jsem několik skvělých zdrojů pro učení o regulárních výrazech. Je jich více, než jsem zde uvedl, ale tyto jsou zvláště užitečné:

  • grep manuálová stránka má dobrou referenci, ale není vhodná pro učení o regulárních výrazech.
  • Kniha O’Reilly, Ovládání regulárních výrazů , od Jeffreyho E. F. Friedla, je dobrým návodem a referencí pro regulární výrazy. Doporučuji to každému, kdo je nebo chce být správcem systému Linux, protože budete používat regulární výrazy.
  • Kniha O’Reilly sed &awk:UNIX Power Tools , od Arnolda Robbinse a Dalea Doughertyho, je další dobrá. Pokrývá oba tyto mocné nástroje a má také vynikající diskusi o regulárních výrazech.

Existuje také několik dobrých webových stránek, které vám mohou pomoci dozvědět se o regulárních výrazech a které poskytují zajímavé a užitečné příklady regulárních výrazů ve stylu kuchařské knihy. Jsou tací, kteří za jejich používání žádají peníze. Jason Baker, můj technický recenzent pro 1. a 2. díl mého Použití a správa Linuxu kurz navrhuje regexcrossword.com jako dobrý učební nástroj.

Přehled

Tato série poskytla stručný úvod do složitého světa regulárních výrazů. Prozkoumali jsme implementaci regulárního výrazu v grep nástroj v dostatečné hloubce, abyste získali představu o některých úžasných věcech, kterých lze dosáhnout pomocí regulárních výrazů. Podívali jsme se také na několik linuxových nástrojů a programovacích jazyků, které také implementují regulární výrazy.

Ale nenechte se mýlit! Pouze jsme poškrábali povrch těchto nástrojů a regulárních výrazů. Je toho mnohem víc, co se můžete naučit, a jak vidíte, existují k tomu skvělé zdroje.

Poznámka: Tento článek je mírně upravená verze kapitoly 6 z druhého dílu mého samostudia Linuxu „Using and Administering Linux:Zero to SysAdmin“, která má vyjít na Apressu koncem roku 2019.


Linux
  1. Pokročilé regulární výrazy v příkazu Grep s 10 příklady – část II

  2. Regulární výrazy v příkazu Grep s 10 příklady – část I

  3. Co znamená \b ve vzoru grep?

  1. Začínáme s regulárními výrazy:Příklad

  2. Představení regulárních výrazů

  3. číselný rozsah extraktu grep

  1. Výpis všech e-mailových adres v souboru s grep

  2. Bash:Regulární výrazy v substituci?

  3. Není \d podporováno základními výrazy grepu?