Was ist der Unterschied zwischen der Option grep -e und der Option grep -E?

34

Ich versuche den Unterschied zwischen grep -eund zu verstehen grep -E. Jetzt habe grep manpageich bekommen:

-E, --extended-regexp

Interpretieren Sie PATTERN als erweiterten regulären Ausdruck (siehe unten).

-e MUSTER, --regexp = MUSTER

Verwende MUSTER als Muster. nützlich, um Muster zu schützen, die mit - beginnen

Die obige Erklärung macht für mich keinen Sinn.

Kann mir jemand erklären, examplesworin der Unterschied besteht und wann ich welche Option verwenden soll?

PS: Version: grep (GNU grep) 2.10

ronnie
quelle
Siehe auch: unix.stackexchange.com/questions/17949/…
Mechanische Schnecke
3
Der Zweck von -eist wirklich nur zu disambiguieren, wenn ein Regex mit einem Gedankenstrich beginnt. Also grep ---foogibts unrecognized option: ---foodoch kann man sagen grep -e ---foogrep für den regulären Ausdruck ---foo.
Tripleee

Antworten:

29

-eist genau das Flag, das angibt, mit welchem ​​Muster Sie übereinstimmen möchten. -Esteuert, ob Sie bestimmte Sonderzeichen maskieren müssen.

man greperklärt -Ees ein bisschen mehr:

   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.
Hafichuk
quelle
2
Das ist also der Grund, warum ich echo "hello" | grep -o -e 'h|l'keine Ausgabe erhalte, weil es |seine spezielle Bedeutung verliert und wenn ich echo "hello" | grep -o -E 'h|l'die gewünschte Ausgabe erhalte.
2
Ja. echo "hello" | grep -o -e 'h' -e 'l'wird funktionieren, wenn Sie -Ein diesem Fall wegwerfen möchten .
Hafichuk
3
grep -e -o 'h|l'wird buchstäblich übereinstimmen, h|lwährend grep -e -o 'h\|l'wird übereinstimmen hoder lund mit -E ist es das Gegenteil
Nahuel Fouilleul
@ronnie es ist bedauerlich, dass Sie über 200 Ruf benötigen, damit Ihnen dieses "Feature" zwischen SE-Sites folgt ...
hafichuk
5

Auch grep -emehrere Strings für die Suche ermöglicht zu verwenden: 'grep -e 'abc' -e 'def' -e '123'für alle drei dieser Strings aussehen: abcsowie defund 123.

Dies funktioniert ganz ähnlich wie bei grep 'abc\|def\|123'where \|steht or, könnte aber etwas klarer zu lesen sein.

Da die wichtigsten Fakten grep -Ehier bereits erläutert sind, möchte ich nur noch eine ganz ähnliche Frage hinzufügen, die ich zu diesem Thema zusammengefasst habe: Regulärer Ausdruck zum Finden von Doppelzeichen in Bash

erch
quelle
3

siehe unten

/verlängert

grep versteht drei verschiedene Versionen der regulären Ausdruckssyntax: "basic", "extended" und "perl". In GNU grep gibt es keinen Unterschied in der verfügbaren Funktionalität zwischen Basic- und Extended-Syntax. In anderen Implementierungen sind reguläre Basisausdrücke weniger leistungsfähig. Die folgende Beschreibung gilt für erweiterte reguläre Ausdrücke. Unterschiede für grundlegende reguläre Ausdrücke werden anschließend zusammengefasst. Perl-reguläre Ausdrücke bieten zusätzliche Funktionen und sind in pcresyntax (3) und pcrepattern (3) dokumentiert, sind jedoch möglicherweise nicht auf jedem System verfügbar.

Also noch einmal.

In GNU grep gibt es keinen Unterschied in der verfügbaren Funktionalität zwischen grundlegenden und erweiterten Syntaxen

ДМИТРИЙ МАЛИКОВ
quelle
2
Die Funktionalität ist für Basic und Extended gleich, die Syntax unterscheidet sich jedoch geringfügig. regExp Sonderzeichen wie (, ), |usw. notwendig sein Backslash-escaped ihre besondere Bedeutung in der Grund regexp haben, aber nicht in ausgedehnt (wo sie benötigen als Stringliteral behandelt werden maskiert werden)
cas
1

Nur um die -eOption zu erläutern . -eist oft optional:

grep PATTERN

ist identisch mit

grep -e PATTERN

es sei denn, wie in einer früheren Antwort und in den Manpages angegeben, gibt es mehrere Suchmuster, oder um ein Muster zu schützen, das mit einem Bindestrich (-) beginnt.

flow2k
quelle