Próbuję zrozumieć różnicę między grep -e
a grep -E
. Teraz z grep manpage
mam:
-E, –extended-regexp
Interpretuj WZORZEC jako rozszerzone wyrażenie regularne (zobacz poniżej).
-e WZÓR, –regexp = WZÓR
Użyj WZORCA jako wzorca; przydatne do ochrony wzorców zaczynających się od –
Powyższe wyjaśnienie nie ma dla mnie sensu.
Czy ktoś może to wyjaśnić ja używam examples
jaka jest różnica między nimi i kiedy użyć której opcji.
PS: Wersja: grep (GNU grep) 2.10
Komentarze
Odpowiedź
-e
jest ściśle flagą wskazującą wzorzec, do którego chcesz dopasować. -E
określa, czy należy zmienić znaczenie niektórych znaków specjalnych.
man grep
wyjaśnia -E
to 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.
Komentarze
- więc to jest powód, dla którego Nie widzę
echo "hello" | grep -o -e 'h|l'
danych wyjściowych, ponieważ|
straciło swoje specjalne znaczenie, a kiedy to zrobięecho "hello" | grep -o -E 'h|l'
Otrzymuję żądane wyjście. - Tak.
echo "hello" | grep -o -e 'h' -e 'l'
zadziała, jeśli chcesz w tym przypadku wyrzucić-E
. - będzie pasować dosłownie
h|l
, podczas gdygrep -e -o 'h\|l'
będzie pasować doh
lubl
i -E it ' jest odwrotnie - @ronnie it ' na nieszczęście potrzebujesz ponad 200 punktów reputacji, aby " funkcja " śledziła Cię między witrynami SE …
Odpowiedź
Ponadto grep -e
pozwala na użycie kilku ciągów znaków do wyszukiwania: "grep -e "abc" -e "def" -e "123"
wyszuka dowolny z trzech z tych ciągów: abc
oraz def
i 123
.
Działa podobnie do grep "abc\|def\|123"
, gdzie \|
oznacza dla or
ale c powinien być trochę jaśniejszy do przeczytania.
Ponieważ najważniejsze fakty dotyczące grep -E
zostały już tutaj wyjaśnione, chcę tylko dodać to, co podsumowałem na ten temat na całkiem podobne pytanie: Wyrażenie regularne do znajdowania podwójnych znaków w Bash
Odpowiedź
patrz poniżej
/ rozszerzone
grep rozumie trzy różne wersje składni wyrażeń regularnych: „podstawowa”, „rozszerzona” i „perl”. W GNU grep nie ma różnicy w dostępnej funkcjonalności między podstawową i rozszerzoną składnią. W innych implementacjach podstawowe wyrażenia regularne są mniej wydajne. Poniższy opis dotyczy rozszerzonych wyrażeń regularnych; różnice dotyczące 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 między podstawową i rozszerzoną składnią
Komentarze
- funkcjonalność jest taka sama dla wersji podstawowej i rozszerzonej, ale składnia jest nieco inna. Znaki specjalne wyrażenia regularnego, takie jak
(
,)
,|
itp., należy zamienić ukośnikiem odwrotnym na mają swoje specjalne znaczenie w podstawowym wyrażeniu regularnym, ale nie w rozszerzonym (gdzie muszą zostać zmienione, aby były traktowane jako literał ciągu)
Odpowiedź
Aby bardziej szczegółowo omówić opcję -e
. -e
jest często opcjonalne:
grep PATTERN
jest identyczne 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 zaczynającego się od łącznika (-).
-e
jest tak naprawdę tylko ujednoznacznienie, kiedy wyrażenie regularne zaczyna się od myślnika. Tak więcgrep ---foo
dajeunrecognized option: ---foo
, ale możesz powiedziećgrep -e ---foo
, aby grepować dla wyrażenia regularnego---foo
.