#1 Le 28/01/2011, à 15:04
- Postmortem
[Résolu] sed et les plages d'adresses
Bonjour à tous !
Une petite question sur sed ; lorsque l'on fait la commande ci-dessous, l'action de substitution 's/tutu/titi/' ne s'applique que jusqu'à la première ligne contenant MOTIF2 :
sed '/MOTIF1/,/MOTIF2/s/tutu/titi/' un_fichier.txt
Comment faire pour que cela s'applique jusqu'au 2ème ou 3ème voir le dernier MOTIF2 ??
Dernière modification par Postmortem (Le 29/01/2011, à 17:03)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#2 Le 28/01/2011, à 15:30
- FRUiT
Re : [Résolu] sed et les plages d'adresses
sed -r
Non ?
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#3 Le 28/01/2011, à 17:07
- Postmortem
Re : [Résolu] sed et les plages d'adresses
Salut FRUiT,
Non, ce n'est pas ça.
Un petit exemple pour que cela soit plus claire.
Voici le contenu du fichier test_sed.txt :
gzrgreggrgzzg
grzegzg
DEBUT
rgzergzeg
vvvvvvvvvvv
FIN
rgzagzhz
rgagrzgbrze
FIN
erzgartba
atabetbna
FIN
hjegkjhf
kjghefkjgheaz
Si je fais (le -r dit à sed d'utiliser les expressions rationnelles étendues à la place des basiques mais ça n'étend pas la plage d'adresses) :
sed '/DEBUT/,/FIN/s/..*/aaaaaaaaaaaaaaaaaaaaaaaaa/' test_sed.txt
J'obtiens :
gzrgreggrgzzg
grzegzg
aaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaa
rgzagzhz
rgagrzgbrze
FIN
erzgartba
atabetbna
FIN
hjegkjhf
kjghefkjgheaz
Les lignes modifiées sont celles entre DEBUT et le premier FIN (inclus).
Je voudrais que ça modifie jusqu'au 2ème, 3ème etc... ou dernier FIN.
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#4 Le 29/01/2011, à 04:10
- ehmicky
Re : [Résolu] sed et les plages d'adresses
Personnellement, si tu veux utiliser juste sed en une ligne, je pense pas que ce soit possible sans passer par des goto (:, b et t) ou utiliser une autre commande (externe ou bash) ou une expansion du style :
sed -n "/DEBUT/,$(sed -n '/FIN/=' FILE | sed -n '$p') s/.*/aaa/" FILE
Mais je peux me tromper !
Dernière modification par ehmicky (Le 29/01/2011, à 04:43)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#5 Le 29/01/2011, à 17:03
- Postmortem
Re : [Résolu] sed et les plages d'adresses
Merci ehmicky ! Ça fonctionne... presque !! Manquait juste un petit ';p' à la fin du sed pour afficher le résultat !
sed -n "/DEBUT/,$(sed -n '/FIN/=' test_sed.txt | sed -n '$p') s/.*/aaa/;p" test_sed.txt
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#6 Le 29/01/2011, à 17:37
- ehmicky
Re : [Résolu] sed et les plages d'adresses
Ah oui, c'est vrai, tu peux même enlever le ";". Je pensais que ton problème était plus "théorique" au niveau de la manière dont sed gère les adresses, parce que c'est vrai qu'il est moins puissant à ce niveau-là que awk.
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#7 Le 29/01/2011, à 17:45
- Postmortem
Re : [Résolu] sed et les plages d'adresses
Il faut bien le ';', selon le cas ! Sans le ';' ça n'affiche que les lignes où il y a eu la substitution. Avec, toutes les lignes (modifiées ou non) sont affichées.
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne