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 jakosed
aawk
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 jakosort
,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.