Encontrei uma pergunta semelhante:
Mas neste caso quero verificar não o comprimento total, mas o número de dígitos na linha. Por exemplo, desta entrada:
cdc85e24-b9e9-8802-080a-b84479e1ae82
ekodeveloper0
1795475824.1129747.1472396049615.ref
1795475824.1129747.1472396049615
967175540.1194446.1472407271491
wangxiuyan552
jveazey
xoloki
whelee
matthauck
patel3.anirudh
mischa.salle
Como posso excluir todas as linhas com mais de N dígitos?
Responder1
Como você marcou sua pergunta perl
, uma maneira de fazer isso em Perl seria usar o fato de que Perl tr
retorna uma contagem do número de caracteres substituídos; então, por exemplo (tomando N = 13
), você poderia fazer
perl -ne 'print unless tr/[0-9]/[0-9]/ > 13' file
ekodeveloper0
wangxiuyan552
jveazey
xoloki
whelee
matthauck
patel3.anirudh
mischa.salle
Uma maneira possivelmente mais convencional seria avaliar a correspondência de regex em um contexto escalar para obter uma contagem
perl -ne '$c = () = /\d/g; print unless $c > 13' file
Veja por exemploExiste um atalho Perl para contar o número de correspondências em uma string?
Responder2
É mais fácil manter apenas linhas com X oumaisnúmeros. Aqui está um exemplo onde X é 13:
sed -n 's/[0-9]/&/13p' input.txt > output.txt
No entanto, você pode modificar isso para fazer o inverso. Aqui está um comando que manterá apenas as linhas commenos de 13números:
sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt > output.txt
Explicação - imprima apenas linhas com mais de 13 números
sed -n 's/[0-9]/&/13p' input.txt > output.txt
O &
símbolo no texto de substituição significa “tudo o que foi correspondido”.
O sinalizador numérico no s
comando (após a /find/replace/
parte) significa apenas substituir aquela instância do padrão de pesquisa.
A p
bandeira no s
comando significa “imprimir se uma substituição foi feita”.
A -n
opção, é claro, é suprimir a ação "imprimir" padrão do Sed.
Explicação - imprima apenas linhas com <13 números
sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt > output.txt
A -e
opção é "executar"; apenas passa um comando. Precisamos disso aqui já que estamos passando por mais de um.
O t
comando ignora os comandos restantes se o último s
comando executou uma substituição.
O p
comando é impresso.