Suas duas perguntas são basicamente as mesmas. Em expressões regulares, *
significa "corresponde ao caractere anterior 0 ou mais vezes". Portanto, 1*
corresponderá a 0 ou mais 1
, mas 11*
corresponderá a 1
seguido por 0 ou mais 1
. Isso significa que
-
grep "11*"
imprimirá somente linhas contendo pelo menos um1
. O*
aplica-se apenas ao segundo1
, portanto, o primeiro é obrigatório. É por isso que você não vê as linhas vazias, elas não correspondem a1
. -
grep "1*"
corresponderá a 0 ou mais1
. Aqui, você não tem um caractere anterior que precisa ser correspondido, então as linhas em branco também são correspondidas porque elas contêm 01
. -
grep "111*"
,grep "1111*"
etc não correspondem pelo mesmo motivo que o primeiro ponto acima.111*
imprimirá apenas linhas contendo pelo menos 21
, possivelmente mais.1111*
corresponderá a linhas contendo pelo menos 31
, possivelmente mais.
O ponto principal aqui é que o *
afeta apenas o caractere imediatamente anterior, não o padrão inteiro. Para dar um quantificador a um padrão inteiro, você pode usar parênteses:
$ grep '\(111\)*' regex.txt
1
11
111
1111
11111
$
Aqui, os parênteses (eles precisam ser escapados com \
para que não sejam incluídos no padrão de pesquisa) agrupam os caracteres juntos para que o *
seja aplicado ao grupo. Como você vê acima, isso corresponde a linhas contendo 0 ou mais ocorrências de 111
, portanto, imprime todas as linhas.