BASH: grep multi ligne (dotall) et non gourmant (non-greedy)
Avec bash, pour effectuer ce genre de regex avec grep, j'ai trouvé l'astuce suivante:
# cat monfichier.xml | tr -d "\n" | grep -Po "<desc>.*?</desc>"
Dans mon fichier xml, mes balises <desc> sont étalées sur 3 lignes
...
<desc>
13.0 km, 0:13
</desc>
<desc>
4.0 km, 0:6
</desc>
...
du coup, pour les extraire correctement de mon fichier, je suis obligé de faire une recherche avec une regex qui ne tient pas compte des retours à la ligne et qui n'est surtout pas gourmande (non-greedy) afin de ne pas extraire en une seule fois toutes les balises <desc>
Pour le problème des retours à la ligne, j'utilise la commande tr pour les supprimer.
Pour le problème du "non-greedy", j'utilise grep avec l'option -P, afin d'indiquer à grep d'utiliser la regex comme une regex Perl pour pouvoir interpréter correctement l'indicateur "?" qui permet justement d'obtenir le comportement "non-greedy"
Ajouter un commentaire