¿Cómo "grep" para la longitud de línea en un rango dado?

28

NOTA: Esta pregunta es el complemento de estas preguntas y respuestas: ¿Cómo "grep" para la longitud de línea * no * en un rango dado?


Necesito obtener solo las líneas de un archivo de texto (una lista de palabras, separadas por una nueva línea) que tiene un rango de longitud mínimo o igual a 3 caracteres, pero no más largo o igual a 10.

Ejemplo:

ENTRADA:

egyezményét
megkíván
ki
alma
kevesen
meghatározó

SALIDA:

megkíván
alma
kevesen

Pregunta: ¿Cómo puedo hacer esto bash?

agc
fuente
99
grep -x '.\{3,10\}'
Costas
@Costas brillante, y lo mismo vale para sed también. Publica una respuesta completa.
orion

Respuestas:

37
grep -x '.\{3,10\}'

dónde

  • -x emparejar el patrón con toda la línea
  • . cualquier símbolo
  • {3,10} cuantificar de 3 a 10 veces el símbolo anterior (en el caso cualquiera)
Costas
fuente
10

usando egrep

egrep '^.{3,10}$'

coincide desde el principio hasta el final de las líneas para 3 o más caracteres pero menos o igual a 10 caracteres.

repzero
fuente
1

Utilizando sed:

sed '/^.\{3,10\}$/!d'

O:

sed -r '/^.{3,10}$/!d'
agc
fuente
0

Utilizando awk:

awk 'length >= 3 && length <= 10' file

La lengthinstrucción devolvería la longitud de $0(el registro / línea actual) de forma predeterminada, y el código lo usa para probar si la longitud de la línea está dentro del rango dado. Si una prueba como esta no tiene un bloque de acción correspondiente, la acción predeterminada es imprimir el registro.

Prueba en los datos dados:

$ awk 'length >= 3 && length <= 10' file
megkíván
alma
kevesen

De manera similar con Perl:

$ perl -lne '$l=length($_); print if ($l >= 3 && $l <= 10)' file
megkíván
alma
kevesen
Kusalananda
fuente