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.