Isso está acontecendo porque os a*
e b*
não são citados e, portanto, são expandidos pelo shell anterior sendo passado para grep
. Por exemplo, considere este diretório:
$ ls
afile.txt bfile.txt regex.txt
Se eu tentar executar grep a* regex.txt
, o a*
se tornará afile.txt
e é isso que será fornecido como um padrão de pesquisa para grep
. Podemos usar a opção de depuração do bash ( set -x
) para demonstrar:
$ set -x
$ grep a* regex.txt
+ grep --color afile.txt regex.txt
O motivo pelo qual funcionou para d
e não para a
ou b
é que você tem arquivos ou diretórios cujos nomes começam com a
e b
em seu diretório atual. Se você não fez, teria funcionado:
$ ls
afile.txt bfile.txt regex.txt
$ grep a* regex.txt ## no output, it's searching for 'afile.txt'
$ rm afile.txt ## now there are no filenames starting with a
$ grep a* regex.txt
1
11
111
1111
11111
111111
d
da
daa
daaa
b
bc
bcc
bccc
Para evitar isso, sempre cite seus padrões de pesquisa :
grep "a*" regex.txt
Ou
grep 'a*' regex.txt