Por que o `grep fil *` falha?


9

Eu encontrei echo file|grep fil*falhou, mas echo abcd|grep abc*conseguiu.

Eu não entendo, alguém pode explicar?


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.*'.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.