Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente | |||
doc:sed-non-greedy-pattern [01/05/2023 18:38] arpinux suppression : fusion avec https://debian-facile.org/doc:systeme:sed |
— (Version actuelle) | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Sed et recherche de motif non-gourmande ====== | ||
- | |||
- | * Objet : sed et recherche non-gourmande de motif (non-greedy pattern) | ||
- | * Niveau requis : {{tag>avisé}} | ||
- | * Commentaires : sed, regex, commandes avancées | ||
- | * A savoir : [[:utilisateurs:hypathie:tutos:sed-et-les-expressions-rationnelles]] | ||
- | * Suivi : {{tag>à-placer à-tester à-placer}} | ||
- | * Création par [[user>David5647]] 31/08/2020 | ||
- | * Testé par <...> le <...> FIXME | ||
- | * Commentaires sur le forum : [[https://debian-facile.org/viewtopic.php?pid=341973#p341973]] | ||
- | |||
- | ==== Comportement par défaut ==== | ||
- | |||
- | Par défaut, lors de la recherche d'une expression régulière, la correspondance retournée par sed est la plus longue chaîne de caractères possible. | ||
- | |||
- | Soit le texte suivant: | ||
- | <code>Une 1ère phrase. Une deuxième phrase. Une troisième phrase. Une quatrième phrase!</code> | ||
- | Extraire la première phrase c'est lister tout les caractères jusqu'au premier point, soit l'expression régulière : | ||
- | <code>.*/.</code> | ||
- | |||
- | Mais une telle recherche renvoie la plus longue chaîne possible: | ||
- | <code user>echo "Une 1ère phrase. Une deuxième phrase. Une troisième phrase. Une quatrième phrase!" | sed -r 's/(.*\.).*/\1/'</code> | ||
- | <code>Une 1ère phrase. Une deuxième phrase. Une troisième phrase.</code> | ||
- | |||
- | ==== Recherche non-gourmande ==== | ||
- | |||
- | Pour effectuer une recherche plus restrictive et trouver la plus petite chaîne correspondante, il suffit simplement de rechercher tout les caractères sauf le point. Soit l'expression régulière suivante: | ||
- | <code>[^.]*\.</code> | ||
- | On obtient alors : | ||
- | <code user>echo "Une 1ère phrase. Une deuxième phrase. Une troisième phrase. Une quatrième phrase!" | sed -r 's/([^.]*\.).*/\1/'</code> | ||
- | <code>Une 1ère phrase.</code> | ||
- | |||
- | ==== Aller plus loin ==== | ||
- | |||
- | En répétant la motif plusieurs fois, on peut alors extraire toutes les correspondances. Soit l'expression régulière: | ||
- | <code>([^.]*\.){$i}</code> avec i le nombre de répétitions | ||
- | |||
- | Soit dans une boucle: | ||
- | <code user>for i in 1 2 3; do | ||
- | echo "Une 1ère phrase. Une deuxième phrase. Une troisième phrase. Une quatrième phrase!" | sed -r "s/([^.]*\.){$i}.*/\1/" ; | ||
- | done</code> | ||
- | <code>Une 1ère phrase. | ||
- | Une deuxième phrase. | ||
- | Une troisième phrase.</code> | ||
- | |||
- | Voilà, c'est bête, mais j'ai cherché longtemps :P | ||
- | |||