Preciso extrair (ou contar) as linhas (em um arquivo) que possuem dois ou mais pontos. As linhas não devem começar com um ponto (tudo bem se elas terminarem com um ponto), e não deve haver dois pontos seguidos (ou seja, os pontos são todos separados por caracteres que não sejam pontos).
Exemplo de saída:
a.b.
a.b.com
a.b.c.
a.b.c.com
Mas não:
a.com
a..b
a.b.c..d
Eu fiz este comando:
grep -P '^[^.]+\.([^.]+\.)+[.]+' file.txt | wc -l
mas não encontrou nenhuma linha correspondente. Como devo fazer isso?
\.
e[.]
são equivalentes — ambos correspondem a um ponto literal e não a qualquer outro caractere. Por uma questão de estilo, escolha um e use-o de forma consistente.([^.]+\.)+
seguida por[.]+
. Isso é realmente (mais ou menos) equivalente a[^.]+\.
seguido por[.]
, com o resultado de que seu grep está procurando por linhas que contenham , ou seja, dois pontos seguidos. Se você verificar, verá que seu comando corresponde a .text.text..
a.b..
[.]
para[^.]
(talvez seja isso que você quis dizer originalmente?), altere o seguinte+
para um*
e adicione um$
. Depois de um certo número de grupos, exija/permita qualquer número (zero ou mais) caracteres além do ponto, até o final da linha.text.
grep
encontra linhas que começam com um caractere sem ponto e incluem pelo menos dois pontos. O segundogrep
remove linhas que possuem dois pontos consecutivos.grep … | wc -l
, apenas façagrep -c …
.Usando
awk
:O
awk
programa aqui usa o ponto como separador de campo. Uma linha com dois ou mais pontos é o mesmo que uma linha com mais de dois campos. Isso é o que oNF > 2
teste testa. A primeira expressão regular descarta as linhas que começam com um ponto e a segunda expressão regular descarta as linhas que contêm dois pontos ou mais em uma linha. As demais linhas são impressas.A mesma coisa com
grep
:A primeira expressão extrai linhas que contenham pelo menos dois pontos, e as duas outras excluem linhas que começam com um ponto ou contêm dois pontos consecutivos.
Ou com
sed
,Você pode fazer isso com lookarounds, como mostrado:
Para ser lido como:
^
(?!\.)
(?!.*\.\..*)
(?=.*\..*\.)