Comment «grep» pour la longueur de ligne dans une plage donnée?

28

REMARQUE: Cette question est le complément de cette Q&R: Comment "grep" pour la longueur de ligne * pas * dans une plage donnée?


Je dois obtenir uniquement les lignes d'un fichier texte (une liste de mots, séparés par un retour à la ligne) qui a une plage de longueur minimale ou égale à 3 caractères, mais pas plus longue ou égale à 10.

Exemple:

CONTRIBUTION:

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

SORTIE:

megkíván
alma
kevesen

Question: Comment puis-je faire cela en bash?

agc
la source
9
grep -x '.\{3,10\}'
Costas
@Costas brillant, et il en va de même pour sed. Postez une réponse complète.
orion

Réponses:

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

  • -x faire correspondre le motif à toute la ligne
  • . n'importe quel symbole
  • {3,10} quantifier de 3 à 10 fois le symbole précédent (dans le cas échéant)
Costas
la source
10

en utilisant egrep

egrep '^.{3,10}$'

correspond du début à la fin des lignes pour 3 caractères ou plus mais inférieur ou égal à 10 caractères.

repzero
la source
1

En utilisant sed:

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

Ou:

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

En utilisant awk:

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

L' lengthinstruction retournerait la longueur de $0(l'enregistrement / la ligne en cours) par défaut, et ceci est utilisé par le code pour tester si la longueur de la ligne est dans la plage donnée. Si un test comme celui-ci n'a pas de bloc d'action correspondant, l'action par défaut consiste à imprimer l'enregistrement.

Test sur les données fournies:

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

De même avec Perl:

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