Quelle est la différence entre les options grep -e et grep -E?

34

J'essaie de comprendre la différence entre grep -eet grep -E. Maintenant, grep manpagej'ai eu:

-E, --extended-regexp

Interprétez PATTERN comme une expression régulière étendue (voir ci-dessous).

-e PATTERN, --regexp = PATTERN

Utilisez PATTERN comme motif; utile pour protéger les motifs commençant par -

L'explication ci-dessus n'a pas de sens pour moi.

Alors, quelqu'un peut-il m'expliquer en utilisant examplesquelle est la différence entre les deux et quand utiliser quelle option.

PS: Version: grep (GNU grep) 2.10

Ronnie
la source
3
Le but de -eest simplement de lever la ambiguïté quand une expression rationnelle commence par un tiret. Donc, grep ---foodonne unrecognized option: ---foomais tu peux dire grep -e ---fooà grep pour l'expression régulière ---foo.
triplee

Réponses:

29

-eest strictement le drapeau pour indiquer le motif contre lequel vous voulez apparier. -Econtrôle si vous devez échapper à certains caractères spéciaux.

man grepl'explique -Eun peu plus:

   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
la source
2
c'est donc la raison pour laquelle je ne echo "hello" | grep -o -e 'h|l'reçois aucune sortie parce que j'ai |perdu sa signification particulière et que lorsque echo "hello" | grep -o -E 'h|l'j'obtiens la sortie désirée.
2
Oui. echo "hello" | grep -o -e 'h' -e 'l'travaillera si vous voulez jeter le -Eloin dans ce cas.
Hafichuk
3
grep -e -o 'h|l'correspondra littéralement h|lpendant que grep -e -o 'h\|l'correspondra hou let -E c'est le contraire
Nahuel Fouilleul
@ronnie c'est dommage que vous ayez besoin de plus de 200 points de réputation pour que cette "fonctionnalité" vous suive entre les sites SE ...
hafichuk
5

grep -ePermet également d'utiliser plusieurs chaînes pour la recherche: 'grep -e 'abc' -e 'def' -e '123'recherchera ces trois chaînes: abcainsi que defet 123.

Cela fonctionne assez similaire à grep 'abc\|def\|123'\|signifie ormais peut être un peu plus clair à lire.

Comme les faits les plus importants sur grep -Esont déjà expliqués ici, je veux juste ajouter ce que j'ai résumé sur ce sujet sur une question assez similaire: Expression rationnelle pour trouver des caractères doubles dans Bash

erch
la source
3

voir ci-dessous

/élargi

grep comprend trois versions différentes de la syntaxe des expressions rationnelles: “basic”, “extended” et “perl”. Dans GNU grep, il n'y a pas de différence de fonctionnalité entre les syntaxes de base et étendues. Dans d'autres implémentations, les expressions régulières de base sont moins puissantes. La description suivante s'applique aux expressions régulières étendues. les différences pour les expressions rationnelles de base sont résumées par la suite. Les expressions régulières Perl apportent des fonctionnalités supplémentaires. Elles sont décrites dans pcresyntax (3) et pcrepattern (3), mais peuvent ne pas être disponibles sur tous les systèmes.

Alors encore une fois.

Dans GNU grep, il n’existe aucune différence dans les fonctionnalités disponibles entre les syntaxes de base et étendues.

ДМИТРИЙ МАЛИКОВ
la source
2
la fonctionnalité est la même entre base et étendue mais la syntaxe est légèrement différente. RegExp caractères spéciaux comme (, ), |etc besoin d'être échappé antislash avoir leur signification particulière dans regexp de base, mais pas étendu (où ils doivent être échappé à être traité comme un littéral de chaîne)
No CAS
1

Juste pour élaborer sur l' -eoption. -eest souvent optionnel:

grep PATTERN

est identique à

grep -e PATTERN

Comme indiqué dans une précédente réponse et dans les pages de manuel, il existe plusieurs modèles de recherche ou pour protéger un modèle commençant par un trait d'union (-).

flow2k
la source