¿Es posible encontrar líneas en un archivo que superen los 79 caracteres?
fuente
¿Es posible encontrar líneas en un archivo que superen los 79 caracteres?
En orden de disminución de la velocidad (en un sistema GNU en un entorno UTF-8 y en entrada ASCII) de acuerdo con mis pruebas:
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
Excepto para el perl¹ uno (o para awk/ grep/ sedimplementaciones (como mawku busybox) que no admiten caracteres de varios bytes), que cuenta la longitud en términos de número de caracteres (de acuerdo con la LC_CTYPEconfiguración de la configuración regional) en lugar de bytes .
Si hay bytes en la entrada que no forman parte de caracteres válidos (lo que sucede a veces cuando el juego de caracteres de la configuración regional es UTF-8 y la entrada está en una codificación diferente), entonces, dependiendo de la solución y la implementación de la herramienta, esos bytes contará como 1 carácter, o 0 o no coincidirá ..
Por ejemplo, una línea que consta de 30 asa 0x80 byte, 30 bs, 0x81 byte y 30 UTF-8 és (codificada como 0xc3 0xa9), en un entorno local UTF-8 no coincidiría .\{80\}con GNU grep/ sed(como ese byte independiente 0x80 no coincide .), tendría una longitud de 30 + 1 + 30 + 1 + 2 * 30 = 122 con perlo mawk, 3 * 30 = 90 con gawk.
Si desea contar en términos de bytes, arregle la configuración regional Ccon LC_ALL=C grep/awk/sed....
Eso tendría las 4 soluciones, considere que la línea anterior contiene 122 caracteres. Excepto en las perlherramientas GNU, aún tendría problemas potenciales para las líneas que contienen caracteres NUL (0x0 byte).
¹ el perlcomportamiento puede verse afectado por la PERL_UNICODEvariable de entorno
awkpuede acercarse si se cae($0), lo cual está implícito de todos modos;).^, es un poco más rápido: por ejemplogrep '^.\{80\}' file.grep '^.\{1000\}' fileregresagrep: invalid repetition count(s), mientrasawk 'length>1000' filetiene éxito.)Enfoque de Shell:
Enfoque de Python:
O como una secuencia de comandos breve para facilitar la lectura:
Si quisiéramos excluir el carácter de nueva línea
\nde los cálculos, podemos hacer queif len(line) > 79seaif len(line.strip()) > 79Nota al margen: esta es la sintaxis de Python 2.7. Uso
print()para Python 3fuente