Jag försöker förstå skillnaden mellan grep -e
och grep -E
. Nu från grep manpage
fick jag:
-E, –extended-regexp
Tolk PATTERN som ett utökat reguljärt uttryck (se nedan).
-e PATTERN, –regexp = PATTERN
Använd PATTERN som mönster; användbart för att skydda mönster som börjar med –
Förklaringen ovan är inte meningsfull för mig.
Så, kan någon förklara det för jag använder examples
vad är skillnaden mellan de två och när ska jag använda vilket alternativ.
PS: Version: grep (GNU grep) 2.10
Kommentarer
Svar
-e
är strikt flaggan för att ange det mönster du vill matcha mot. -E
styr om du behöver undvika vissa specialtecken.
man grep
förklarar -E
det lite mer:
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.
Kommentarer
- så detta är anledningen när Jag gör
echo "hello" | grep -o -e 'h|l'
Jag får ingen effekt eftersom|
tappade sin speciella betydelse och när jagecho "hello" | grep -o -E 'h|l'
Jag får önskad effekt. - Ja.
echo "hello" | grep -o -e 'h' -e 'l'
fungerar om du vill kasta-E
i det här fallet. -
grep -e -o 'h|l'
matchar bokstavligenh|l
medangrep -e -o 'h\|l'
matcharh
ellerl
och med -E det ' är tvärtom - @ronnie it ' s olyckligt att du behöver 200+ rykte för att " -funktionen " ska följa dig mellan SE-webbplatser …
Svar
Även grep -e
gör det möjligt att använda flera strängar för att söka: "grep -e "abc" -e "def" -e "123"
söker efter någon av de tre av dessa strängar: abc
samt def
och 123
.
Detta fungerar ganska likt grep "abc\|def\|123"
där \|
står för or
men c skulle vara lite tydligare att läsa.
Eftersom de viktigaste fakta om grep -E
redan förklaras här, vill jag bara lägga till det jag sammanfattade om detta ämne på en ganska liknande fråga: Regeluttryck för att hitta dubbeltecken i Bash
Svar
se nedan
/ utökad
grep förstår tre olika versioner av syntax för reguljära uttryck: ”grundläggande”, ”utökad” och ”perl.” I GNU grep är det ingen skillnad i tillgänglig funktionalitet mellan grundläggande och utökade syntaxer. I andra implementeringar är grundläggande reguljära uttryck mindre kraftfulla. Följande beskrivning gäller utvidgade reguljära uttryck; skillnader för grundläggande reguljära uttryck sammanfattas efteråt. Perl-reguljära uttryck ger ytterligare funktionalitet och dokumenteras i pcresyntax (3) och pcrepattern (3), men kanske inte är tillgängliga i alla system.
Så , ännu en gång.
I GNU grep är det ingen skillnad i tillgänglig funktionalitet mellan grundläggande och utökade syntaxer
Kommentarer
- -funktionaliteten är densamma mellan grundläggande och utökad men syntaxen är något annorlunda. regexp specialtecken som
(
,)
,|
etc måste back-snedsträckt till har sin speciella betydelse i grundläggande regexp, men inte i utökad (där de behöver undvikas för att behandlas som en strängbokstavlig)
Svar
Bara för att utveckla alternativet -e
. -e
är ofta valfritt:
grep PATTERN
är identiskt med
grep -e PATTERN
såvida inte, som anges i ett tidigare svar och på mansidorna, det finns flera sökmönster eller för att skydda ett mönster som börjar med bindestreck (-).
-e
är egentligen bara att göra det otydligt när en regex börjar med en streck. Sågrep ---foo
gerunrecognized option: ---foo
men du kan sägagrep -e ---foo
till grep för det reguljära uttrycket---foo
.