Jaka jest różnica między opcją grep -e i grep -E?

34

Próbuję zrozumieć różnicę między grep -ei grep -E. Teraz grep manpageotrzymałem:

-E, --extended-regexp

Interpretuj WZÓR jako rozszerzone wyrażenie regularne (patrz poniżej).

-e WZORZEC, --regexp = WZORZEC

Użyj WZORCA jako wzorca; przydatne do ochrony wzorów zaczynających się od -

Powyższe wyjaśnienie nie ma dla mnie sensu.

Czy ktoś może mi to wyjaśnić, używając examplesróżnicy między nimi i kiedy użyć której opcji.

PS: Wersja: grep (GNU grep) 2.10

Ronnie
źródło
Zobacz także: unix.stackexchange.com/questions/17949/…
Ślimak mechaniczny
3
Celem -ejest tak naprawdę tylko ujednoznacznienie, gdy wyrażenie regularne zaczyna się od myślnika. To grep ---foodaje, unrecognized option: ---fooale możesz powiedzieć grep -e ---foogrep dla wyrażenia regularnego ---foo.
tripleee

Odpowiedzi:

29

-ejest ściśle flagą wskazującą wzór, który chcesz dopasować. -Ekontroluje, czy musisz uciec od niektórych znaków specjalnych.

man grepwyjaśnia -Eto trochę więcej:

   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
źródło
2
dlatego nie echo "hello" | grep -o -e 'h|l'otrzymuję żadnych danych wyjściowych, ponieważ |straciłem swoje specjalne znaczenie, a kiedy to robię echo "hello" | grep -o -E 'h|l', otrzymuję pożądany wynik.
2
Tak. echo "hello" | grep -o -e 'h' -e 'l'zadziała, jeśli -Ew tym przypadku chcesz wyrzucić .
hafichuk
3
grep -e -o 'h|l'będzie pasować dosłownie, h|ldopóki grep -e -o 'h\|l'będzie pasować hlub lz -E jest odwrotnie
Nahuel Fouilleul
@ronnie to niefortunne, że potrzebujesz 200+ reputacji, aby ta „funkcja” śledziła Cię między witrynami SE ...
hafichuk 10.10
5

grep -ePozwala również na użycie kilku ciągów wyszukiwania:'grep -e 'abc' -e 'def' -e '123' poszuka wszystkich trzech ciągów: abcoraz deforaz 123.

Działa to dość podobnie do grep 'abc\|def\|123' gdzie \|stoi za or, ale może być nieco jaśniejsze czytać.

Ponieważ najważniejsze fakty grep -Esą już tutaj wyjaśnione, chcę tylko dodać to, co podsumowałem na ten temat, w dość podobnym pytaniu: Wyrażenie regularne do znajdowania podwójnych znaków w Bash

erch
źródło
3

patrz poniżej

/rozszerzony

grep rozumie trzy różne wersje składni wyrażeń regularnych: „podstawowe”, „rozszerzone” i „perl”. W GNU grep nie ma różnicy w dostępnej funkcjonalności pomiędzy podstawowymi i rozszerzonymi składniami. W innych implementacjach podstawowe wyrażenia regularne są mniej wydajne. Poniższy opis dotyczy rozszerzonych wyrażeń regularnych; różnice dla podstawowych wyrażeń regularnych są następnie podsumowane. Wyrażenia regularne Perla zapewniają dodatkową funkcjonalność i są udokumentowane w pcresyntax (3) i pcrepattern (3), ale mogą nie być dostępne w każdym systemie.

Więc jeszcze raz.

W GNU grep nie ma różnicy w dostępnej funkcjonalności pomiędzy podstawową i rozszerzoną składnią

ДМИТРИЙ МАЛИКОВ
źródło
2
funkcjonalność jest taka sama między podstawowym i rozszerzonym, ale składnia jest nieco inna. regexp znaki specjalne, takie jak (, ), |itp trzeba być odwrotny ukośnik-uciekł mają swoje szczególne znaczenie w podstawowej regexp, ale nie w rozszerzony (gdzie muszą być uciekł należy traktować jako ciągiem znaków)
cas
1

Aby rozwinąć tę -eopcję. -ejest często opcjonalne:

grep PATTERN

jest identyczny z

grep -e PATTERN

chyba że, jak stwierdzono we wcześniejszej odpowiedzi i na stronach podręcznika, istnieje wiele wzorców wyszukiwania lub w celu ochrony wzorca rozpoczynającego się od łącznika (-).

flow2k
źródło