Sed recalcitrant

Résolu/Fermé
eric_49 - 5 août 2009 à 16:49
 eric_49 - 6 août 2009 à 15:45
Bonjour,

Je voudrais dans un fichier test.txt ,
1 . faire une recherche de motif sur plusieurs lignes
2 . à la suite de ce motif ajouter 3 lignes
3 . faire cet ajout pour toutes les occurences du motif en question


j'ai essayé ça :

sed -n '/vip/d;/^debut_motif/,/fin_motif$/p' test.txt | sed -f prog.sed > sortie.txt

le prog.sed contient ça :
a\
ligne1\
ligne2\
ligne3

Donc ça ne fonctionne pas du tout : le script colle le texte partout !!

je pense qu'il faudrait arriver à chainer les commandes du type :

sed '/motif/; ajout du texte' test.txt > sortie.txt

quelqu'un peut me donner un coup de main ?

merci d'avance,

9 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
5 août 2009 à 18:41
Salut,
[tmpfs]$ cat plop
blablabla
blablablablablabla
motif Début
blablabla
blablabla
blablabla
motif Fin
blablablablablabla
blablabla
motif Début
blablablablablabla
motif Fin
blablabla
blablablablablabla
blablabla
blablabla
motif Début
blablabla
motif Fin
blablabla
blablabla

[tmpfs]$ sed '/motif Début/,/motif Fin/{/motif Fin/a\
ligne1\
ligne2\
ligne3
}
' plop
blablabla
blablablablablabla
motif Début
blablabla
blablabla
blablabla
motif Fin
ligne1
ligne2
ligne3
blablablablablabla
blablabla
motif Début
blablablablablabla
motif Fin
ligne1
ligne2
ligne3
blablabla
blablablablablabla
blablabla
blablabla
motif Début
blablabla
motif Fin
ligne1
ligne2
ligne3
blablabla
blablabla

[tmpfs]$
;-))
0
Ok, ça marche !
J'avais essayé ça mais je n'avais pas remis le motif de fin.

Bravo, tu es vraiment le gourou du sed.
Je vais m'y mettre sérieusement...

et merci beaucoup

eric
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
6 août 2009 à 10:14
L'ajout et l'insertion n'acceptent qu'une seul adresse (et non pas une plage), donc il faut d'abord cibler une plage d'adresses et au sein de cette plage, cibler l'adresse qui va bien...

;-))
0
Encore un petit soucis :
la commande fonctionne quand je colle dans un terminal, par contre en script ça ne passe pas...
le shell me repond :

fonction '/motif_a_eviter/d;/debut_motif/,/fin_motif/{/fin_motif/a\ cannot be parsed

??

dans un script il faut peut etre mettre sur une seule ligne ?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
6 août 2009 à 11:34
Elle ressemble à quoi ta syntaxe dans le script ?

La même syntaxe que plus haut dans un script passe bien chez moi ;-\
0
voilà mon script :

sed '/vip/d;/^<Name>X/,/Icon>$/{/Icon>$/a\
ligne1\
ligne2\
ligne3
}
' test.txt > sortie.txt

je ne comprends pas
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
6 août 2009 à 11:48
Pourquoi le message d'erreur plus haut fait état d'une fonction ?

C'est du bash ton script ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
non, c'est du ksh

!!
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
6 août 2009 à 11:55
Et pour la fonction ?

C'est possible d'avoir le fichier d'entrée et le script en entier ?
0
j'ai compris l'erreur jipicy :

j'insère des lignes comme celles là :

<Attribute>\
<Name>ov_label1</Name>\
<Value>ORACLE</Value>\
<ActionRef>ora_consigne-1<\/ActionRef>\
<ActionRef>ora_consigne-2<\/ActionRef>\
<ActionRef>ora_consigne-3<\/ActionRef>


et ça fait l'erreur en question (si je met ligne1, ligne2 etc... pas de pb)

j'ai essayé d'echapper les / avec des \ mais ce n'est pas bon....et meme avec la première ligne
ça fait l'erreur aussi !!
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
6 août 2009 à 14:32
Y'a pas de raisons que ça ne marche pas :-\
 ssh$ sed '/motif Début/,/motif Fin/{/motif Fin/a\
<lalala>xxx</lalala>\
<lololo>yyy</lololo>\
<lululu>zzz</lululu>
}
' plop
blablabla
blablablablablabla
motif Début
blablabla
blablabla
blablabla
motif Fin
<lalala>xxx</lalala>
<lololo>yyy</lololo>
<lululu>zzz</lululu>
blablablablablabla
blablabla
motif Début
blablablablablabla
motif Fin
<lalala>xxx</lalala>
<lololo>yyy</lololo>
<lululu>zzz</lululu>
blablabla
blablablablablabla
blablabla
blablabla
motif Début
blablabla
motif Fin
<lalala>xxx</lalala>
<lololo>yyy</lololo>
<lululu>zzz</lululu>
blablabla
blablabla
Colle-nous un bout de ton fichier et ta syntaxe "sed" s'il te plaît...
0
ok, voilà le script (sans fonction ^^) :

#!/usr/bin/ksh

sed '/vip/d;/^<Name>X/,/Icon>$/{/Icon>$/a\
<Attribute>
}
' test.txt > sortie.txt


et voilà un extrait du fichier à modifier :

<Service>
<Name>PROD_ORA8</Name>
<Label>Oracle 8</Label>
<Icon>logo_oracle.png</Icon>
<CalcRuleRef>Most critical</CalcRuleRef>
<MsgPropRuleRef>Unchanged</MsgPropRuleRef>
</Service>
<Association>
<Dependency/>
<SourceRef>XGDGF</SourceRef>
<TargetRef>PROD_ORA8</TargetRef>
<PropRuleRef>Unchanged</PropRuleRef>
</Association>
<Service>
<Name>XFDGF</Name>
<Label>XFDGF</Label>
<Icon>logo_oracle.png</Icon>
<Depth>2</Depth>
<CalcRuleRef>Most critical</CalcRuleRef>
<MsgPropRuleRef>Unchanged</MsgPropRuleRef>
</Service>
<Association>
<Dependency/>
<SourceRef>xtruc.fr</SourceRef>
<TargetRef>XBIDXX</TargetRef>
<PropRuleRef>Unchanged</PropRuleRef>
</Association>
<Association>
<Dependency/>
<SourceRef>XDFEYY</SourceRef>
<TargetRef>PROD_ORA8</TargetRef>
<PropRuleRef>Unchanged</PropRuleRef>
</Association>
<Service>
<Name>XXTTYU</Name>
<Icon>logo_oracle.png</Icon>
<Depth>2</Depth>
<CalcRuleRef>Most critical</CalcRuleRef>

chez moi ça ne passe pas !!
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
6 août 2009 à 15:08
 ssh$ cat eric.ksh
#! /bin/ksh

sed '/vip/d;/^<Name>X/,/Icon>$/{/Icon>$/a\
<Attribute>
}
' toto

 ssh$ ./eric.ksh
<Service>
<Name>PROD_ORA8</Name>
<Label>Oracle 8</Label>
<Icon>logo_oracle.png</Icon>
<CalcRuleRef>Most critical</CalcRuleRef>
<MsgPropRuleRef>Unchanged</MsgPropRuleRef>
</Service>
<Association>
<Dependency/>
<SourceRef>XGDGF</SourceRef>
<TargetRef>PROD_ORA8</TargetRef>
<PropRuleRef>Unchanged</PropRuleRef>
</Association>
<Service>
<Name>XFDGF</Name>
<Label>XFDGF</Label>
<Icon>logo_oracle.png</Icon>
<Attribute>
<Depth>2</Depth>
<CalcRuleRef>Most critical</CalcRuleRef>
<MsgPropRuleRef>Unchanged</MsgPropRuleRef>
</Service>
<Association>
<Dependency/>
<SourceRef>xtruc.fr</SourceRef>
<TargetRef>XBIDXX</TargetRef>
<PropRuleRef>Unchanged</PropRuleRef>
</Association>
<Association>
<Dependency/>
<SourceRef>XDFEYY</SourceRef>
<TargetRef>PROD_ORA8</TargetRef>
<PropRuleRef>Unchanged</PropRuleRef>
</Association>
<Service>
<Name>XXTTYU</Name>
<Icon>logo_oracle.png</Icon>
<Attribute>
<Depth>2</Depth>
<CalcRuleRef>Most critical</CalcRuleRef>

0
ok, merci Jipicy

ça fonctionne , ouf !!

j'ai recréé mon script et c'est ok ; je pense qu'il y avait des caractères invisibles
qui mettait la grouille.


merci de ton aide et bonnes vacances !
0