¿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
/ sed
implementaciones (como mawk
u 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_CTYPE
configuració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 a
sa 0x80 byte, 30 b
s, 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 perl
o mawk
, 3 * 30 = 90 con gawk
.
Si desea contar en términos de bytes, arregle la configuración regional C
con LC_ALL=C grep/awk/sed...
.
Eso tendría las 4 soluciones, considere que la línea anterior contiene 122 caracteres. Excepto en las perl
herramientas GNU, aún tendría problemas potenciales para las líneas que contienen caracteres NUL (0x0 byte).
¹ el perl
comportamiento puede verse afectado por la PERL_UNICODE
variable de entorno
awk
puede 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\}' file
regresagrep: invalid repetition count(s)
, mientrasawk 'length>1000' file
tiene é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
\n
de los cálculos, podemos hacer queif len(line) > 79
seaif len(line.strip()) > 79
Nota al margen: esta es la sintaxis de Python 2.7. Uso
print()
para Python 3fuente