Eu encontrei echo file|grep fil*
falhou, mas echo abcd|grep abc*
conseguiu.
Eu não entendo, alguém pode explicar?
Eu encontrei echo file|grep fil*
falhou, mas echo abcd|grep abc*
conseguiu.
Eu não entendo, alguém pode explicar?
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ão fil*
significa f
seguido por i
seguido por zero ou mais l
caracteres. 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 , 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.*'
.
echo file|grep fil*
respostas comfil
e.