Bem, você sabe que o padrão de pesquisa contém um '-' e você sabe que, quando o padrão de pesquisa contiver um '-', será necessário usar o sinalizador -e . Como você não está usando o sinal -e , o shell está interpretando seu "padrão" como um argumento (e um parâmetro). Você pode ver isso com:
$ grep "-foo" file1
grep: oo: No such file or directory
Por extensão, seu código grep "-example" file1 está dizendo ao shell que você deseja executar grep com o argumento -e e um parâmetro "xample".
Este é o mesmo problema que encontramos quando tentamos algo como rm -my-silly-file-name - não funciona, e precisamos usar algo como rm ./-my-silly-file-name . Outra solução alternativa seria rm -- -my-silly-file-name . Podemos usar esse idioma aqui:
$ grep -- "-example" < file1
-example
O "-" diz ao shell que tudo depois dele não é um argumento.
Alternativamente, você pode simplesmente escapar do "-" com um "\", como você viu:
grep "\-example" file1
Este artigo vai em alguns detalhes sobre a citação : a parte relevante é Parâmetros e comandos backquoted que devem ser interpretados pelo shell são colocados entre aspas duplas. Quando você usa aspas duplas, o conteúdo é interpretado por o shell.