2009-09-13 6 views
1

Je suis en train d'avoir la course de commande pour extraire une plage de dates à partir d'un fichier et les imprimersed ne pas récupérer toutes les valeurs pour la deuxième paramètre

ex: -ne sed «/^ 2009-08-20/,/^ 2009-08-26/p '

Pourtant, j'ai plusieurs occurrences de 2009-08-26 dans le fichier, je veux que tous reviennent, mais il ne renvoie que le premier. Est-il possible d'avoir tout retour?

Merci!

Répondre

4

-ne sed '/^2009-08-20 /,/^ 2009-08-26/être;/^ 2009-08-26/être; d;: ep'

Pour expliquer: ' e 'est une étiquette et si vous êtes dans la gamme vous branchez à cette étiquette. Vous donnez une seconde chance et vous vérifiez si c'est la fin de la gamme. Sinon, supprimez la ligne.

+0

Génial !!!!! Merci beaucoup! –

+1

hey, j'aime cette solution. Vous pouvez le rendre encore plus court en omettant l'étiquette explicite et l'impression en utilisant autoprint: 'sed -e '/^2009-08-20 /,/^ 2009-08-26/b;/^ 2009-08-26/b; d'' – mihi

+0

Vous avez raison! Cela a l'air mieux. – Vereb

2

La raison pour laquelle il renvoie uniquement la première correspondance de la date de fin est qu'une plage va de la première correspondance du premier motif à la première correspondance du second motif (inclus) et arrête l'impression jusqu'au premier motif se produit à nouveau. Si vous n'avez pas problème à écrire le deuxième motif trois fois, vous pouvez utiliser

sed -ne '/^2009-08-20/,/^2009-08-26/{/^2009-08-26/!p};/^2009-08-26/p' 

qui imprime une ligne si elle est entre la date de départ (inclus) et la date de fin (exclusive) - c'est ce que le! fait) ou si elle commence avec la date de fin.

Questions connexes