Estou tentando entender a diferença entre grep -e e grep -E. Agora de grep manpage eu obtive:

-E, –extended-regexp

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

-e PATTERN, –regexp = PATTERN

Use PATTERN como o 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 explicá-la para eu usando examples qual é a diferença entre os dois e quando usar qual opção.

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

Comentários

  • Veja também: unix.stackexchange.com/questions/17949/…
  • O objetivo de -e é realmente apenas eliminar a ambigüidade quando uma regex começa com um travessão. Portanto, grep ---foounrecognized option: ---foo, mas você pode dizer grep -e ---foo para grep para a expressão regular ---foo.

Resposta

-e é estritamente o sinalizador para indicar o padrão com o qual você deseja fazer a correspondência. -E controla se você precisa escapar certos caracteres especiais.

man grep explica -E um 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. 

Comentários

  • então este é o motivo quando Eu echo "hello" | grep -o -e 'h|l' não recebo nenhuma saída porque | perdeu seu significado especial e quando o faço echo "hello" | grep -o -E 'h|l' Eu obtenho a saída desejada.
  • Sim. echo "hello" | grep -o -e 'h' -e 'l' funcionará se você quiser jogar o -E fora neste caso.
  • grep -e -o 'h|l' corresponderá literalmente a h|l enquanto grep -e -o 'h\|l' corresponderá a h ou l e com -E it ' s o contrário
  • @ronnie it ' É uma pena que você precisa de mais de 200 reputação para ter esse " recurso " segui-lo entre os sites SE …

Resposta

Além disso, grep -e permite usar várias strings para pesquisa: "grep -e "abc" -e "def" -e "123" procurará por qualquer uma das três strings: abc, bem como def e 123.

Funciona de maneira bastante semelhante a grep "abc\|def\|123" onde \| está para or mas c deveria ser um pouco mais claro de ler.

Como os fatos mais importantes em grep -E já foram explicados aqui, quero apenas acrescentar o que resumi neste tópico em uma pergunta bastante semelhante: Expressão regular para encontrar caracteres duplos no Bash

Resposta

veja abaixo

/ extendido

grep entende três versões diferentes da sintaxe de expressão regular: “básica,” “estendida” e “perl.” No GNU grep, não há diferença na funcionalidade disponível entre as sintaxes básicas e estendidas. Em outras implementações, as 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 Perl fornecem funcionalidade adicional e sã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 as sintaxes básicas e estendidas

Comentários

  • a funcionalidade é a mesma entre básico e estendido, mas a sintaxe é um pouco diferente. caracteres especiais regexp como (, ), | etc, precisam ter uma barra invertida escapada para têm seu significado especial na expressão regular básica, mas não na extensão (onde precisam ser escapados para serem tratados como uma string literal)

Resposta

Apenas para elaborar a opção -e. -e geralmente é 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 (-).

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *