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
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çoecho "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 ah|l
enquantogrep -e -o 'h\|l'
corresponderá ah
oul
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 (-).
-e
é realmente apenas eliminar a ambigüidade quando uma regex começa com um travessão. Portanto,grep ---foo
dáunrecognized option: ---foo
, mas você pode dizergrep -e ---foo
para grep para a expressão regular---foo
.