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 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 comfile.