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 | Dernière révision Les deux révisions suivantes | ||
doc:systeme:sed [25/01/2021 14:27] Croutons [Préparation aux exemples d'illustration de ce tuto :] |
doc:systeme:sed [01/05/2023 18:37] arpinux fusion avec le tuto de David5647 - recherche non gourmande |
||
---|---|---|---|
Ligne 551: | Ligne 551: | ||
//Merci à //**cthulu**// Hop !// LOL | //Merci à //**cthulu**// Hop !// LOL | ||
+ | ===== Sed et recherche de motif non-gourmande ===== | ||
+ | |||
+ | * Création par [[user>David5647]] 31/08/2020 | ||
+ | * 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 | ||
===== Lien : ===== | ===== Lien : ===== | ||