Vamos considerar isso como um arquivo de teste:
$ cat testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
1.2.3.4 5.6.7.8 9.10.11 Bad: Missing 1
1.2.3.4 5.6.7.8 9.10.11.12. Bad: Extra period
Usando o grep
Para selecionar linhas com exatamente nove períodos:
$ grep -E '^([^.]*\.){9}[^.]*$' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
[^.]*\.
corresponde a qualquer número de caracteres não periódicos seguido por um ([^.]*\.){9}
corresponde exatamente a nove sequências de zero ou mais caracteres não periódicos seguidos por um período. O ^
no início requer que a correspondência de expressão regular comece no início da linha. O [^.]*$
significa que, entre o final das nove seqüências e o final da linha, apenas caracteres não periódicos são permitidos.
Usando sed
$ sed -En '/^([^.]*\.){9}[^.]*$/p' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
A opção -n
diz ao sed para não imprimir, a menos que seja explicitamente solicitado. O p
após o regex solicita explicitamente ao sed para imprimir as linhas que correspondem ao regex.
Usando o awk
$ awk '/^([^.]*\.){9}[^.]*$/' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
Ou, usando a habilidade do awk para definir um personagem para separar campos (dica do chapéu: Jeff Schaller ) :
$ awk -F. 'NF==10' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep