Estou tentando pesquisar a substring "abc" em um arquivo específico no linux / bash
Então eu faço:
grep '*abc*' myFile
Não retorna nada.
Mas se eu fizer:
grep 'abc' myFile
Ele retorna as correspondências corretamente.
Agora, isso não é um problema para mim. Mas e se eu quiser pesquisar uma string mais complexa, diga
*abc * def *
Como eu faria isso usando grep?
*
significa a mesma coisa em grep e egrep: é um quantificador que significa zero ou mais do átomo anterior. Esse é um conceito completamente diferente dos curingas usados pelo shell.Respostas:
O asterisco é apenas um operador de repetição , mas você precisa dizer o que você repete.
/*abc*/
corresponde a uma string contendo ab e zero ou mais c's (porque o segundo * está no c; o primeiro não tem sentido porque não há nada para repetir). Se você quiser corresponder a qualquer coisa, você precisa dizer.*
- o ponto significa qualquer caractere ( dentro de certas diretrizes ). Se você deseja corresponder apenas a abc, basta dizergrep 'abc' myFile
. Para uma correspondência mais complexa, você precisa usar.*
-grep 'abc.*def' myFile
irá corresponder a uma string que contém abc seguido por def com algo opcionalmente no meio.Atualização com base em um comentário:
*
em uma expressão regular não é exatamente igual a * no console. No console, * é parte de uma construção glob e apenas atua como um curinga (por exemplols *.log
, listará todos os arquivos que terminam em .log). No entanto, em expressões regulares, * é um modificador, o que significa que se aplica apenas ao caractere ou grupo que o precede. Se você quiser * em expressões regulares para atuar como um curinga, você precisa usar.*
como mencionado anteriormente - o ponto é um caractere curinga, e a estrela, ao modificar o ponto, significa encontrar um ou mais pontos; ou seja, encontre um ou mais de qualquer personagem.fonte
*
significa "0 ou mais", e grep é ganancioso por padrão. Note que no grep básicas de expressões regulares os metacaracteres?
,+
,{
,|
,(
, e)
perdem seu significado especial. Mais informações: grepO caractere ponto significa corresponder a qualquer caractere, portanto,
.*
significa zero ou mais ocorrências de qualquer caractere. Você provavelmente pretende usar em.*
vez de apenas*
.fonte
O "signo" só tem significado se houver algo na frente dele. Se não houver a ferramenta (grep neste caso), pode tratar isso apenas como um erro. Por exemplo:
'*xyz' is meaningless 'a*xyz' means zero or more occurrences of 'a' followed by xyz
fonte
Use grep -P - que ativa o suporte para expressões regulares de estilo Perl.
grep -P "abc.*def" myfile
fonte
A expressão que você tentou, como aquelas que funcionam na linha de comando do shell no Linux, por exemplo, é chamada de " glob ". Expressões Glob não são expressões regulares completas , que é o que grep usa para especificar strings a serem procuradas. Aqui está um post (antigo, pequeno) sobre as diferenças. As expressões glob (como em "ls *") são interpretadas pelo próprio shell.
É possível traduzir de globs para REs, mas normalmente você precisa fazer isso em sua cabeça.
fonte
Você não está usando expressões regulares, então sua variante grep de escolha deve ser
fgrep
, que se comportará como você espera.fonte
fgrep
agora está obsoleto,grep -f
deve ser usado em seu lugar.Tente grep -E para suporte estendido de expressão regular
Também dê uma olhada em:
A página de manual do grep
fonte
Esta pode ser a resposta que você está procurando:
A única coisa é ... ele irá mostrar linhas onde "def" está antes OU depois de "abc"
fonte
Isso funcionou para mim:
grep ". * $ {expr}" - com aspas duplas, precedidas do ponto. Onde "expr" é qualquer string de que você precisa no final da linha.
Grep unix padrão sem opções adicionais.
fonte
'*' funciona como um modificador para o item anterior. Portanto, 'abc * def' procura por 'ab' seguido por 0 ou mais 'c's seguidos por' def '.
O que você provavelmente deseja é 'abc. * Def', que procura por 'abc' seguido por qualquer número de caracteres, seguido por 'def'.
fonte