Retirado diretamente da Wikipédia :
? O ponto de interrogação indica zero ou uma ocorrência do precedente elemento. Por exemplo, colou? R corresponde tanto "cor" e "cor".
* O asterisco indica zero ou mais ocorrências do elemento anterior. Por exemplo, ab * c corresponde a "ac", "abc", "abbc", "abbbc" e assim por diante.
A grande diferença é que o asterisco corresponde a zero ou mais ocorrências, enquanto o ponto de interrogação corresponde a zero ou uma ocorrência. Compare estes dois exemplos:
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou?r'
colour
color
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou*r'
colour
color
colouur
Como em colouur
a letra u (o elemento anterior antes do qualificador ?
) ocorreu mais de uma vez, ela não corresponde a ?
, mas corresponde a *
Exemplo semelhante:
$ printf "error\neror\ner\n" | egrep 'er?or'
eror
$ printf "error\neror\ner\n" | egrep 'er*or'
error
eror
Da mesma página da Wikipédia:
Corresponde a qualquer caractere único (muitos aplicativos excluem novas linhas e exatamente quais caracteres são considerados novas linhas é sabor codificação de caracteres e específico da plataforma, mas é seguro assumir que o caractere de alimentação de linha está incluído). Dentro do suporte POSIX expressões, o caractere de ponto corresponde a um ponto literal. Por exemplo, a.c corresponde a "abc", etc., mas [a.c] corresponde apenas a "a", "." ou "c".
No nosso exemplo,
$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'
colouur
Apropriadamente, o último é lido como match any line that has "colou", plus any character, plus letter "r"
Conclusão
Você perguntou: "Eu sei que '*' significa tudo ou nada, mas não tenho certeza se é o jeito certo de pensar sobre isso. Do outro '.' & amp; '?' parece mesmo ". Como você pode ver, o ponto e o asterisco não são exatamente os mesmos. O ponto opera em qualquer caractere que possa ocupar essa posição específica, enquanto o ponto de interrogação opera no elemento precedente.