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

17

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


Comment pouvons-nous chercher des lignes qui ont moins de 8 ou plus de 63 caractères, aucune qui contient plus de huit et moins de 63 caractères?

Ainsi, certains nombres de caractères acceptables pourraient être ...

7 6 5 4 3 2 1 0

...et...

64 65 66 67 ...
LoukiosValentine79
la source
3
Je sais que vous demandez grep, mais vous pouvez considérer awk, surtout si vous avez besoin d'un traitement supplémentaire, etc. (très flexible et lisible ): l' awk '( length($0)<8 ) || ( length($0)>63 )' action #default d'une condition consiste à imprimer la ou les lignes correspondant à la condition. Ou, avec moins de traitement sur 0 $:awk '{ l=length($0) ; if (( l<8 ) || l>63 ) { print $0 ;} }'
Olivier Dulac
@mikeserv - ouais en revoyant cela, il est probablement plus logique de se rapprocher de cette Q&R l'autre en tant que dup.
slm
@mikeserv - c'est généralement une douleur, je dois fusionner les réponses dans l'un des Q et ils sont ensuite supprimés de l'original. Voici les conseils pour le faire: "Les questions doivent être fusionnées lorsqu'elles sont identiques à 99% et il serait avantageux d'avoir toutes les réponses de plusieurs questions en double en un seul endroit. Cela supprime les réponses, les déplace vers la question cible et laisse la question actuelle en tant que talon avec un lien vers son objectif de fusion. "
slm
qu'est-il arrivé à mon commentaire?
Dmitry Grigoryev
@DmitryGrigoryev - suppose que quelqu'un n'a pas aimé. prenez-le à quelqu'un qui a été là - oubliez-le.
mikeserv

Réponses:

38
grep -xv '.\{8,63\}' <input >output

grepLe -xcommutateur indique une correspondance de ligne entière - c'est-à-dire que tout modèle correspondant doit définir une ligne de la tête à la queue. Faire...

grep -x pattern

... équivaut généralement à ...

grep ^pattern$

grepLe -vcommutateur annule l'influence d'un motif sur la sélection de ligne. faisant généralement ...

grep pattern

... sélectionnera uniquement les lignes qui correspondent au modèle, mais avec un -vmodèle annulé, seules les lignes qui ne correspondent pas sont sélectionnées.

...et donc...

grep -xv '.\{8,63\}'

... correspond à toutes les lignes qui se composent de la tête à la queue de n'importe où entre 8 et 63 caractères, et la -vsélection annulée grepne fait qu'imprimer tout le reste.

mikeserv
la source