La commande du mois : sélectionner des lignes


Il arrive de vouloir sélectionner uniquement des lignes de texte situées entre deux marqueurs.


Exemple

Par exemple dans L'herbe rouge de Boris Vian, je veux conserver les lignes entre Carla et Wolf. Plus précisément, je veux tout ce qu'il y a entre une première ligne qui contient Carla et une prochaine ligne qui contient Wolf

Pour ça je vais utiliser la commande sed parce que, on ne le répètera jamais assez, sed c'est bien.


sed -n '/Carla/,/Wolf/p' HerbeRouge.txt


Explication

L'option -n permet de n'afficher a priori aucune ligne. /Carla/ est le premier séparateur. La virgule maintient une plage mémoire jusqu'à la rencontre du second séparateur /Wolf/. Le p provoque l'affichage de la plage mémoire.


Avec cette commande, les deux séparateurs peuvent tout à fait être identiques. Par exemple, si la zone de texte à conserver est délimitée par des ciseaux en ascii-art:

sed -n '/---- %< ----/,/---- %< ----/p' DecoupezMoi.txt


Application

J'ai un grand nombre de fichiers html, je veux sélectionner seulement les headers.


sed -n '/<head>/,/<\/head>/p' *.html


Variante

Cette variante, compacte et mnémotechnique, utilise awk.


awk '/Colin/,/Chloé/' EcumeDesJours.txt


Attention en revanche, ça ne donne pas le résultat attendu quand les deux séparateurs sont identiques. C'est pour ça que j'aime un peu moins. Et puis, je le rappelle :




Aucun commentaire: