Snažím se pochopit rozdíl mezi grep -e a grep -E. Nyní od grep manpage mám:

-E, –extended-regexp

Interpretujte PATTERN jako rozšířený regulární výraz (viz níže).

-e PATTERN, –regexp = PATTERN

Jako vzor použijte PATTERN; užitečné pro ochranu vzorů začínajících –

Výše uvedené vysvětlení pro mě nedává smysl.

Takže, může to někdo vysvětlit používám examples jaký je rozdíl mezi těmito dvěma a kdy použít kterou možnost.

PS: Verze: grep (GNU grep) 2.10

Komentáře

  • Viz také: unix.stackexchange.com/questions/17949/…
  • Účelem -e je opravdu jen disambiguate, když regex začíná pomlčkou. Takže grep ---foo dává unrecognized option: ---foo, ale můžete říci grep -e ---foo, abyste grep pro regulární výraz ---foo.

odpověď

-e je přísně příznak označující vzor, proti kterému se chcete shodovat. -E určuje, zda potřebujete uniknout některým zvláštním znakům.

man grep vysvětluje -E je to o něco více:

 Basic vs Extended Regular Expressions In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{, \|, \(, and \). Traditional egrep did not support the { meta-character, and some egrep implementations support \{ instead, so portable scripts should avoid { in grep -E patterns and should use [{] to match a literal {. GNU grep -E attempts to support traditional usage by assuming that { is not special if it would be the start of an invalid interval specification. For example, the command grep -E "{1" searches for the two-character string {1 instead of reporting a syntax error in the regular expression. POSIX.2 allows this behavior as an extension, but portable scripts should avoid it. 

Komentáře

  • takže to je důvod, když Dělám echo "hello" | grep -o -e 'h|l' nedostávám žádný výstup, protože | ztratil svůj zvláštní význam a když echo "hello" | grep -o -E 'h|l' Mám požadovaný výstup.
  • Ano. echo "hello" | grep -o -e 'h' -e 'l' bude fungovat, pokud chcete v tomto případě odhodit -E.
  • grep -e -o 'h|l' bude odpovídat doslovně h|l, zatímco grep -e -o 'h\|l' bude odpovídat h nebo l a s -E je to ' naopak
  • @ronnie it ' s nešťastím potřebujete více než 200 pověst, aby vás " funkce " sledovala mezi weby SE …

Odpověď

Také grep -e umožňuje pro vyhledávání použít několik řetězců: "grep -e "abc" -e "def" -e "123" vyhledá kterýkoli ze tří těchto řetězců: abc a def a 123.

Funguje to docela podobně jako grep "abc\|def\|123" kde \| stojí pro or ale c měl by být čitelnější.

Protože nejdůležitější fakta o grep -E jsou zde již vysvětlena, chci jen přidat to, co jsem na toto téma shrnul. na docela podobnou otázku: Regulární výraz pro hledání dvojitých znaků v Bash

Odpověď

viz níže

/ extended

grep rozumí třem různým verzím syntaxe regulárního výrazu: „basic“, „extended“ a „perl“. V GNU grep není žádný rozdíl v dostupných funkcích mezi základní a rozšířenou syntaxí. V jiných implementacích jsou základní regulární výrazy méně výkonné. Následující popis platí pro rozšířené regulární výrazy; rozdíly pro základní regulární výrazy jsou následně shrnuty. Regulární výrazy Perl poskytují další funkce a jsou dokumentovány v pcresyntax (3) a pcrepattern (3), ale nemusí být k dispozici ve všech systémech.

Takže , ještě jednou.

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

Komentáře

  • funkčnost je stejná mezi základní a rozšířenou, ale syntaxe se mírně liší. speciální znaky regexp jako (, ), | atd. je třeba uvést zpětným lomítkem na mají svůj speciální význam v základním regulárním výrazu, ale ne v rozšířeném (kde je třeba uniknout, aby se s nimi zacházelo jako s řetězcovým literálem) = „answer“>

    Jen pro upřesnění možnosti -e. -e je často volitelný:

    grep PATTERN 

    je totožný s

    grep -e PATTERN 

    pokud, jak je uvedeno v dřívější odpovědi a na manuálových stránkách, existuje několik vyhledávacích vzorů, nebo k ochraně vzoru začínajícího pomlčkou (-).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *