Como "grep" para o comprimento da linha em um determinado intervalo?

28

NOTA: Esta pergunta é o complemento das perguntas e respostas: Como "grep" para o comprimento da linha * não * em um determinado intervalo?


Eu preciso obter apenas as linhas de um arquivo de texto (uma lista de palavras, separada por uma nova linha) que tenha um intervalo de comprimento mínimo ou igual a 3 caracteres, mas não maior ou igual a 10.

Exemplo:

ENTRADA:

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

SAÍDA:

megkíván
alma
kevesen

Pergunta: Como posso fazer isso bash?

agc
fonte
9
grep -x '.\{3,10\}'
Costas
@ Costas brilhante, e o mesmo vale para sed também. Poste uma resposta completa.
orion

Respostas:

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

Onde

  • -x corresponder padrão à linha inteira
  • . qualquer símbolo
  • {3,10} quantificar de 3 a 10 vezes o símbolo anterior (no caso, qualquer um)
Costas
fonte
10

usando egrep

egrep '^.{3,10}$'

corresponde do início ao fim das linhas para 3 ou mais caracteres, mas menor ou igual a 10 caracteres.

repzero
fonte
1

Usando sed:

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

Ou:

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

Usando awk:

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

A lengthinstrução retornaria o comprimento de $0(o registro / linha atual) por padrão, e isso é usado pelo código para testar se o comprimento da linha está dentro do intervalo especificado. Se um teste como este não tiver um bloco de ação correspondente, a ação padrão é imprimir o registro.

Teste nos dados fornecidos:

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

Da mesma forma com Perl:

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