logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

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 → ODT PDF Export

Ceci est une ancienne révision du document !


Sed et recherche de motif non-gourmande

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:

Une 1ère phrase. Une deuxième phrase. Une troisième phrase. Une quatrième phrase!

Extraire la première phrase c'est lister tout les caractères jusqu'au premier point, soit l'expression régulière :

.*/.

Mais une telle recherche renvoie la plus longue chaîne possible:

echo "Une 1ère phrase. Une deuxième phrase. Une troisième phrase. Une quatrième phrase!" | sed -r 's/(.*\.).*/\1/'
Une 1ère phrase. Une deuxième phrase. Une troisième phrase.

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:

[^.]*\.

On obtient alors :

echo "Une 1ère phrase. Une deuxième phrase. Une troisième phrase. Une quatrième phrase!" | sed -r 's/([^.]*\.).*/\1/'
Une 1ère phrase.

Aller plus loin

En répétant la motif plusieurs fois, on peut alors extraire toutes les correspondances. Soit l'expression régulière:

([^.]*\.){$i}

avec i le nombre de répétitions

Soit dans une boucle:

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
Une 1ère phrase.
 Une deuxième phrase.
 Une troisième phrase.

Voilà, c'est bête, mais j'ai cherché longtemps :P

doc/sed-non-greedy-pattern.1598889580.txt.gz · Dernière modification: 31/08/2020 17:59 par David5647

Pied de page des forums

Propulsé par FluxBB