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?


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)

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.


1

En utilisant sed:

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

Ou:

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.