Encontre quaisquer linhas que excedam um determinado comprimento

Encontre quaisquer linhas que excedam um determinado comprimento

É possível encontrar alguma linha em um arquivo que exceda 79 caracteres?

Responder1

Em ordem decrescente de velocidade (em um sistema GNU em um código de idioma UTF-8 e na entrada ASCII) de acordo com meus testes:

grep '.\{80\}' file

perl -nle 'print if length$_>79' file

awk 'length>79' file

sed -n '/.\{80\}/p' file

Exceto para o perl¹ (ou para implementações awk// (como ou busybox grep) que não suportam caracteres multibyte), que conta o comprimento em termos de número desedmawkpersonagens(de acordo com a LC_CTYPEconfiguração da localidade) em vez debytes.

Se houver bytes na entrada que não fazem parte de caracteres válidos (o que acontece às vezes quando o conjunto de caracteres do código do idioma é UTF-8 e a entrada está em uma codificação diferente), dependendo da solução e da implementação da ferramenta, esses bytes contará como 1 caractere ou 0 ou não corresponderá ..

Por exemplo, uma linha que consiste em 30 asa 0x80 byte, 30 bs, um byte 0x81 e 30 UTF-8 és (codificado como 0xc3 0xa9), em um locale UTF-8 não corresponderia .\{80\}a GNU grep/ sed(já que aquele byte 0x80 autônomo não corresponde .a ), teria um comprimento de 30+1+30+1+2*30=122 com perlou mawk, 3*30=90 com gawk.

Se você quiser contar em termos de bytes, corrija a localidade Ccom LC_ALL=C grep/awk/sed....

Isso faria com que todas as 4 soluções considerassem que a linha acima contém 122 caracteres. Exceto nas perlferramentas GNU, você ainda teria problemas potenciais para linhas que contêm caracteres NUL (byte 0x0).


¹ o perlcomportamento pode ser afetado pela PERL_UNICODEvariável de ambiente

Responder2

Abordagem de casca:

while IFS= read -r line || [ -n "$line" ];
do 
    [ "${#line}" -gt 79 ] && printf "%s\n" "$line"
done < input.txt

Abordagem Python:

python -c 'import sys;f=open(sys.argv[1]);print "\n".join([ l.strip() for l in f if len(l) >79 ]);f.close()' input.txt

Ou como um pequeno script para facilitar a leitura:

#!/usr/bin/env python
import sys

with open(sys.argv[1]) as f:
    for line in f:
        if len(line) > 79:
            print line.strip()

Se quisermos excluir o caractere de nova linha \ndos cálculos, podemos if len(line) > 79fazerif len(line.strip()) > 79

Nota lateral: esta é a sintaxe do Python 2.7. Usar print()para Python 3

informação relacionada