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
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ímcogrep -e -o 'h\|l'
bude odpovídath
nebol
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 (-).
-e
je opravdu jen disambiguate, když regex začíná pomlčkou. Takžegrep ---foo
dáváunrecognized option: ---foo
, ale můžete řícigrep -e ---foo
, abyste grep pro regulární výraz---foo
.