Explication Sed

EminoMeneko Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   -  
EminoMeneko Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
j'aimerais comprendre comment marche sed et pour ce faire j'ai lu le man et divers articles dont ceux-ci
https://forums.commentcamarche.net/forum/affich-37620084-sed-introduction-a-sed-part-i

J'utilise Cygwin en ce moment même mais j'ai Linux en natif également.
J'ai un fichier qui contient ceci

0000-0000-0000-0000
1234-1234-1234-1234
123-12-123-12-12345
123456789-123456789
12345-12345-1234567
12-12-12-12-12-12-1
1111111111111111111


Je souhaitais par exemple afficher les lignes qui sont formatées xxxx-xxxx-xxxx-xxxx avec x un entier.
Pour ce faire j'ai pensé à ces lignes mais elles ne marchent pas. :(
cat serials.txt | sed -n /[0-9]/p 
marche comme prévu
cat serials.txt | sed -n /[0-9]*-/p
marche comme prévu
cat serials.txt | sed -n /\([0-9]\)/p # j'espérais avoir le même comportement que la première ligne mis à part que ce serait une sous-expression
cat serials.txt | sed -n /[0-9]-\{3\}[0-9]/p
ne retourne rien
cat serials.txt | sed -n /\([0-9]\{4\}-\)\{3\}[0-9]\{4\}/p
Ne renvoi rien non plus

Où se situe mon erreur ?
C'est bon j'ai compris fallait mettre les cottes.
Par contre ceci ne marche pas comme je le voulais

cat serials.txt | sed -n '/\([0-9]\{3,5\}-\)[0-9]*/p'
Affiche

0000-0000-0000-0000
1234-1234-1234-1234
123-12-123-12-12345
123456789-123456789 <- Pourquoi cette ligne apparait malgré la ss-exp \([0-9]\{3,5\}-\) ?
12345-12345-1234567


Merci de bien vouloir m'expliquer. :)
Configuration: 
Dual boot Debian /XP
Firefox toujours à jour, Opéra et IE (en cas de force majeure)

1 réponse

jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,

123456789-123456789 <- Pourquoi cette ligne apparait malgré la ss-exp \([0-9]\{3,5\}-\) ?

Parce que la correspondance est avérée.
Ta sous-expression matche bien de 3 à 5 caractères numériques suivis d'un tiret :
123456789-123456789

Pour ne mettre en correspondance que la partie souhaitée, il faut utiliser les limites de mots " \<" et "\>" :
sed -n '/\<\([0-9]\{3,5\}-\)[0-9]*/p'

;-))
0
EminoMeneko Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   318
 
Merci pour l'explication. J'y ait vraiment vu que du feu. :)
On peut dire que la question est résolue mais je ne sais pas si je ne vais pas vouloir reposer des questions plus tard. (Alors pourquoi créer 15 topics sur Sed ?)
0