¿Es posible encontrar líneas en un archivo que superen los 79 caracteres?
Respuesta1
En orden de velocidad decreciente (en un sistema GNU en una configuración regional UTF-8 y en entrada ASCII) según mis pruebas:
grep '.\{80\}' file
perl -nle 'print if length$_>79' file
awk 'length>79' file
sed -n '/.\{80\}/p' file
Excepto por el perl
¹ (o para implementaciones awk
// (como o ocupadobox grep
) que no admiten caracteres multibyte), que cuenta la longitud en términos de número desed
mawk
caracteres(según la LC_CTYPE
configuración local) en lugar debytes.
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 tiene una codificación diferente), entonces, dependiendo de la solución y la implementación de la herramienta, esos bytes contará como 1 carácter, 0 o no coincidirá .
.
Por ejemplo, una línea que consta de 30 a
sa 0x80 bytes, 30 b
s, un 0x81 bytes y 30 UTF-8 é
s (codificados como 0xc3 0xa9), en una configuración regional UTF-8 no coincidiría .\{80\}
con GNU grep
/ sed
(ya que ese byte 0x80 independiente 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 haría que las 4 soluciones consideraran que la línea anterior contiene 122 caracteres. Excepto en perl
las herramientas GNU, aún tendría problemas potenciales para las líneas que contienen caracteres NUL (byte 0x0).
¹ aunque el perl
comportamiento puede verse afectado por la variable de entornoPERL_UNICODE
Respuesta2
Enfoque de caparazón:
while IFS= read -r line || [ -n "$line" ];
do
[ "${#line}" -gt 79 ] && printf "%s\n" "$line"
done < input.txt
Enfoque de 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
O como un guión breve para facilitar la lectura:
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as f:
for line in f:
if len(line) > 79:
print line.strip()
Si quisiéramos excluir el carácter de nueva línea \n
de los cálculos, podemos if len(line) > 79
hacerloif len(line.strip()) > 79
Nota al margen: esta es la sintaxis de Python 2.7. Usar print()
para Python 3