Você pode adicionar o sistema e a versão do grep? Isso porque com o gnugrep 2.16 (no Ubuntu 14.04 LTS), ele não gera nenhum erro (código de saída 0) e corresponde às três primeiras letras. Por exemplo, echo file|grep fil*respostas com file.
Hastur
3
@Hastur O problema é causado pela expansão do nome do arquivo antes da expressão regular. Meu diretório de trabalho contém um arquivo prefixado por fil, mas não um arquivo prefixado por abc; portanto, fil * é substituído pelo nome do arquivo, mas abc * permanece inalterado.
tmpbin
Obrigado, eu não pensei nisso. Quando eu faço minhas tentativas eu experimentá-los em um novo diretório ...
Hastur
Respostas:
31
Existem dois problemas com o seu exemplo.
A principal é que você está assumindo que as expressões regulares funcionam da mesma forma que os padrões glob, pois *é um curinga que significa "qualquer sequência de caracteres". Em expressões regulares, *significa "qualquer número do átomo anterior", então fil*significa fseguido por iseguido por zero ou mais lcaracteres. Você precisa dizer grep fil.*para obter o significado pretendido: .significa "qualquer caractere único, de modo que .*significa" qualquer sequência de caracteres ".
O menor problema é que você está usando caracteres especiais não citados que significam algo sob as regras da glob, o que significa que o shell pode interpretá-los. Se você tivesse algum arquivo no diretório local que correspondesse aos padrões globais fil*ou abc*, o shell os expandisse , grepobteria os nomes de arquivos expandidos como um padrão, não o RE pretendido. Sempre que você está usando esses caracteres na linha de comando, você deve citá-los: echo file | grep 'fil.*'.
echo file|grep fil*
respostas comfil
e.Respostas:
Existem dois problemas com o seu exemplo.
A principal é que você está assumindo que as expressões regulares funcionam da mesma forma que os padrões glob, pois
*
é um curinga que significa "qualquer sequência de caracteres". Em expressões regulares,*
significa "qualquer número do átomo anterior", entãofil*
significaf
seguido pori
seguido por zero ou maisl
caracteres. Você precisa dizergrep fil.*
para obter o significado pretendido:.
significa "qualquer caractere único, de modo que.*
significa" qualquer sequência de caracteres ".O menor problema é que você está usando caracteres especiais não citados que significam algo sob as regras da glob, o que significa que o shell pode interpretá-los. Se você tivesse algum arquivo no diretório local que correspondesse aos padrões globais
fil*
ouabc*
, o shell os expandisse ,grep
obteria os nomes de arquivos expandidos como um padrão, não o RE pretendido. Sempre que você está usando esses caracteres na linha de comando, você deve citá-los:echo file | grep 'fil.*'
.fonte