web-dev-qa-db-fra.com

Quelle est la différence entre l'option grep -e et l'option grep -E?

J'essaie de comprendre la différence entre grep -e et grep -E. Maintenant de grep manpage J'ai eu:

-E, --extended-regexp

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

-e MOTIF, --regexp = MOTIF

Utilisez le MOTIF comme motif; utile pour protéger les modèles commençant par -

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

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

PS: Version: grep (GNU grep) 2.10

36
ronnie

-e est strictement le drapeau pour indiquer le motif auquel vous souhaitez faire correspondre. -E contrôle si vous devez échapper certains caractères spéciaux.

man grep explique -E un 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.
30
hafichuk

Aussi grep -e permet d'utiliser plusieurs chaînes de recherche: 'grep -e 'abc' -e 'def' -e '123' recherchera ces trois chaînes: abc ainsi que def et 123.

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

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

6
erch

voir ci-dessous

/élargi

grep comprend trois versions différentes de la syntaxe des expressions régulières: "de base", "étendu" et "Perl". Dans GNU grep, il n'y a aucune différence dans les fonctionnalités disponibles 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; différences pour les bases régulières Les expressions régulières Perl offrent des fonctionnalités supplémentaires et sont documentées 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'y a aucune différence dans les fonctionnalités disponibles entre les syntaxes de base et étendues

Juste pour élaborer sur le -e option. -e est souvent facultatif:

grep PATTERN

est identique à

grep -e PATTERN

sauf si, comme indiqué dans une réponse précédente et dans les pages de manuel, il existe plusieurs modèles de recherche, ou pour protéger un modèle commençant par un tiret (-).

2
flow2k