web-dev-qa-db-fra.com

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

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


J'ai besoin d'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ó

PRODUCTION:

megkíván
alma
kevesen

Question: Comment puis-je faire cela dans bash?

28
user90825
grep -x '.\{3,10\}'

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

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.

11
repzero

Utilisation de sed:

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

Ou:

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

Utilisation de awk:

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

L'instruction length renverrait la longueur de $0 (l'enregistrement/la ligne en cours) par défaut, et celui-ci est utilisé par le code pour tester si la longueur de la ligne se situe 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
0
Kusalananda