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
?
grep -x '.\{3,10\}'
où
-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)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.
Utilisation de sed
:
sed '/^.\{3,10\}$/!d'
Ou:
sed -r '/^.{3,10}$/!d'
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