Existem dois problemas com o seu exemplo.
A principal é que você está assumindo que expressões regulares funcionam da mesma forma que glob patterns em que *
é um curinga que significa "qualquer seqüê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 .*
signifique" qualquer sequência de caracteres. "
O menor problema é que você está usando caracteres especiais não citados que significam algo sob regras glob, o que significa que o shell pode interpretá-los. Se você tivesse arquivos no diretório local correspondentes aos padrões de glob fil*
ou abc*
, o shell iria expandi-los , então grep
iria obter os nomes dos arquivos expandidos como um padrão, não o RE pretendido. Sempre que você estiver usando esses caracteres na linha de comando, você deve citá-los: echo file | grep 'fil.*'
.