Qual é a diferença entre a opção grep -e e grep -E?

34

Estou tentando entender a diferença entre grep -ee grep -E. Agora, grep manpageeu tenho:

-E, --extended-regexp

Interprete PATTERN como uma expressão regular estendida (veja abaixo).

-e PATTERN, --regexp = PATTERN

Use PATTERN como padrão; útil para proteger padrões começando com -

A explicação acima não faz sentido para mim.

Então, alguém pode me explicar usando examplesqual é a diferença entre os dois e quando usar qual opção.

PS: Versão: grep (GNU grep) 2.10

Ronnie
fonte
Veja também: unix.stackexchange.com/questions/17949/…
Caracol mecânico
3
O objetivo de -erealmente é apenas desambiguar quando um regex começa com um traço. Então grep ---foodá, unrecognized option: ---foomas você pode dizer grep -e ---foopara grep pela expressão regular ---foo.
Tripleee 10/10/12

Respostas:

29

-eé estritamente o sinalizador para indicar o padrão com o qual você deseja corresponder. -Econtrola se você precisa escapar de certos caracteres especiais.

man grepexplica -Eum pouco mais:

   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
fonte
2
Portanto, esse é o motivo pelo qual não echo "hello" | grep -o -e 'h|l'obtenho saída porque |perdi seu significado especial e quando echo "hello" | grep -o -E 'h|l'obtenho a saída desejada.
2
Sim. echo "hello" | grep -o -e 'h' -e 'l'funcionará se você quiser jogar -Efora neste caso.
hafichuk
3
grep -e -o 'h|l'irá corresponder a, literalmente, h|lenquanto grep -e -o 'h\|l'irá corresponder hou le com -E é o contrário
Nahuel FOUILLEUL
@ronnie é uma pena que você precisa de 200 + reputação de ter esse "recurso" segui-lo entre os sites SE ...
hafichuk
5

Também grep -epermite usar várias strings para pesquisa: 'grep -e 'abc' -e 'def' -e '123'procurará todas as três strings: abcassim como defe 123.

Isso funciona muito parecido com o local grep 'abc\|def\|123'onde \|está, ormas pode ser um pouco mais claro de se ler.

Como os fatos mais importantes grep -Ejá estão explicados aqui, só quero acrescentar o que resumi sobre este tópico a uma pergunta bastante semelhante: Expressão regular para encontrar caracteres duplos no Bash

erch
fonte
3

ver abaixo

/ estendido

O grep compreende três versões diferentes da sintaxe de expressão regular: “básico”, “estendido” e “perl”. No GNU grep, não há diferença na funcionalidade disponível entre as sintaxes básica e estendida. Em outras implementações, expressões regulares básicas são menos poderosas. A descrição a seguir se aplica a expressões regulares estendidas; as diferenças para expressões regulares básicas são resumidas posteriormente. Expressões regulares do Perl fornecem funcionalidade adicional e estão documentadas em pcresyntax (3) e pcrepattern (3), mas podem não estar disponíveis em todos os sistemas.

Então, mais uma vez.

No GNU grep, não há diferença na funcionalidade disponível entre sintaxes básicas e estendidas

ДМИТРИЙ МАЛИКОВ
fonte
2
a funcionalidade é a mesma entre básica e estendida, mas a sintaxe é um pouco diferente. Regexp caracteres especiais como (, ), |etc necessidade de ser ter o seu significado especial em regexp básico, mas não em estendido (onde eles precisam ser escapado para ser tratado como um literal string) escapou-barra invertida
cas
1

Apenas para elaborar a -eopção. -egeralmente é opcional:

grep PATTERN

é idêntico a

grep -e PATTERN

a menos que, conforme declarado em uma Resposta anterior e nas páginas de manual, haja vários padrões de pesquisa ou para proteger um padrão que comece com um hífen (-).

flow2k
fonte