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 Prochaine révision | Révision précédente | ||
doc:systeme:sed [25/01/2021 14:27] Croutons [Préparation aux exemples d'illustration de ce tuto :] |
doc:systeme:sed [30/09/2023 22:14] captnfab [Lien :] |
||
---|---|---|---|
Ligne 551: | Ligne 551: | ||
//Merci à //**cthulu**// Hop !// LOL | //Merci à //**cthulu**// Hop !// LOL | ||
- | ===== Lien : ===== | + | ===== Sed et recherche de motif non-gourmande ===== |
- | * Partage d'une petite astuce avec sed (et autres commandes à regex) : | + | * Création par [[user>David5647]] 31/08/2020 |
- | * [[doc:sed-non-greedy-pattern|sed-non-greedy-pattern]] | + | * 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 : ===== | ||
* http://www.funix.org/fr/unix/expr-sed.htm#haut | * http://www.funix.org/fr/unix/expr-sed.htm#haut |