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

Filtered HTML

  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plain text

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
CAPTCHA
Cette question permet de s'assurer que vous êtes un utilisateur humain et non un logiciel automatisé de pollupostage.
CAPTCHA visuel
Entrez les caractères (sans espace) affichés dans l'image.