Petite remarque : toutes les choses auxquelles nous avons réagi sont données directement par le site https://www.shellcheck.net/
Tu copies-colles ton code et tu gagnes du temps.
Version imprimable
Petite remarque : toutes les choses auxquelles nous avons réagi sont données directement par le site https://www.shellcheck.net/
Tu copies-colles ton code et tu gagnes du temps.
Bonjour,
Merci beaucoup.
J'ai regardé et j'ai rien vu.
Pour te montrer un exemple un peut plus précis de ce que j'ai (un peu maquillé) :
Merci d'avance. :)Code:
1
2
3 <contrat name="CONTRAT_test"><description>contrat CONTRAT_test</description><etatContrat><etat name="toto:etatContrat:test"><description>Test</description></etat></etatContrat><services> <service name="InterfaceTest" wsdl="http://xxx.xxx.xxx.xxx:yyyy/mon_test/services/MONCONTEXTETEST/CONTRAT_test/InfoTest?wsdl" accessPoint="http://xxx.xxx.xxx.xxx:yyyy/mon_test/services/MONCONTEXTETEST/CONTRAT_Test/InfoTest"><description>Description</description></service></contrat>
Marco.
Forcément, vu comme ça, ça ne peut pas/plus marcher ;-(
Dans ton exemple primaire, les balises "<contrat>" étaient sur des lignes indépendantes (d'ailleurs "disedorgue" a évoqué à juste titre que le format de fichier xml pouvait ne pas avoir de retour à la ligne).
Là elles ne le sont plus, donc si tu supprimes la ligne contenant l'IP, tu supprimes aussi la balise fermante "</contrat>" et là ça devient problématique et insolvable avec la/les syntaxe(s) donnée(s) plus haut ;-(
Désolé Disedorgue. je me suis en effet trompé en récupérant ce bout de mon fichier XML et en le manipulant :
Je n'avais pas coupé au bon endroit.Code:
1
2
3
4
5
6 ...<contrats> ... <contrat name="CONTRAT_test"><description>contrat CONTRAT_test</description><etatContrat><etat name="toto:etatContrat:test"><description>Test</description></etat></etatContrat><services> <service name="InterfaceTest" wsdl="http://xxx.xxx.xxx.xxx:yyyy/mon_test/services/MONCONTEXTETEST/CONTRAT_test/InfoTest?wsdl" accessPoint="http://xxx.xxx.xxx.xxx:yyyy/mon_test/services/MONCONTEXTETEST/CONTRAT_Test/InfoTest"><description>Description</description></service> </services></contrats>...
En espérant que ça soit un peut plus explicite ?
Comment faire dans ce cas zipe31 s'il te plaît ?
Si tu as gnu sed (avec l'option -z) , essaye:
Code:sed -z 's#<service [^>]*>#\x2&#g;s#</service>#&\x2#g;s#\x2<service[^\x2]*monip[^\x2]*\x2##g;s#<contrat[ >]#\x1&#g;s#</contrat>#&\x1#g;s#\x1<contrat[ >][^\x2]*\x1##g;s#[\x1\x2]##g' fichier.xml
À chaque fois que tu nous remets un bout de ton fichier, il faut réinventer la roue et tout refaire parce que le code donné ne correspond plus :?
Sans compter qu'à chaque fois, il y a des erreurs dans ton fichier (balise <contrat …></contratS>) :roll:
Je passe mon tour :arf:
j'ai commencé par ça dès que j'ai vu ça :Citation:
Je passe mon tour
:ptdr:Citation:
Bash et parsing XML
À sa décharge (et à la mienne), il disait aussi :
:aie:Citation:
Je dois absolument le faire en Bash car je dois intervenir sur une plateforme où je ne peux pas trop installer de nouvelles choses : donc ne ne me proposez pas de Perl ou de Python s'il vous plaît...
il y a des plateformes sur lesquelles python n'est pas installé ?
Tout dépend de la politique de la boîte… tu peux très bien avoir un environnement restreint.
Oui, et surtout pas d'outils qui permet de manipuler des fichiers dans un format imposé...:ptdr:
Moi, je ne me sens pas l'obligation de travailler à la place de Cotmar.
S'il y a déjà installé des outils xml, on peut faire ceci :
Code:
1
2
3
4
5
6
7
8 $ xmlstarlet select -t -m "/services/contrats/contrat/service" -v "@url" -n afac_xml.xml http://monip1 http://monip2 http://monip2 http://monip2 http://monip1 http://monip2 http://monip3
Je n'en demande pas autant... on croirai que tu m'accuses d'avoir un poil dans la main et si je reviens sur d'autres posts, ce n'est pas la première fois. Si je viens sur un forum c'est pour y chercher de l'aide après avoir déjà cherché de mon côté et tenté de trouver sans succès, mais jamais avant. :(
Je précise aussi que si j'ai pris le temps d'écrire une présentation aussi longue au départ c'est précisément pour donner les pistes que j'ai suivi, montrer à quel endroit j'en suis (aussi montrer ma bonne foi) et expliquer ce qui cloche et pourquoi je coince. Là dessus, vous en savez tous largement plus que moi et je remercie tous ceux qui acceptent de m'aider. Votre titre d'experts n'est en rien usurpé.
Bonne soirée,
Marco.
Bonjour,
J'ai continué de mon côté en intégrant vos remarques et en particulier la commande xmlstarlet. Pas évident, mais ouf ça se fait petit à petit :
Merci et comme toujours, si jamais vous avez des remarques, surtout n'hésitez pas. Désolé aussi pour la longueur de ce sujet... :oops:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 #!/bin/bash #----------------------------------------------------------------------- # Mapping des fichiers ".xml" # Pour convertir les adresses de prod en adresses de test # Exemple de exemple.CSV : #xxx.xxx.xxx.xx1:zzz;aaa.aaa.aaa.bb1:ccc #xxx.xxx.xxx.xx2:zzz;aaa.aaa.aaa.bb2:ccc #xxx.xxx.xxx.xx3:yyy;aaa.aaa.aaa.bb3:ddd #xxx.xxx.xxx.xx4:zzz;aaa.aaa.aaa.bb4:ccc #xxx.xxx.xxx.xx5:zzz;suppr => Pour marquer la/les ligne(s) à supprimer #----------------------------------------------------------------------- #----------------------------------------------------------------------- # Gestion derreurs #----------------------------------------------------------------------- usage() { echo "$1" echo "Usage : $0 ficher_de_mapping.txt fichierRecu.xml Pour supprimer une ligne du fichier veuillez insérer la ligne suivante dans le fichier de mapping : IP_origine:suppr Les autres lignes devront etre selon le modèle : IP_origine;IP_destination " exit $2 } #----------------------------------------------------------------------- # Programme principal #----------------------------------------------------------------------- # Date du jour pour historiser la version du fichier dateSys=$(date '+%Y-%m-%d') if [ "$#" -ne "2" ] then usage "Nombre d arguments invalide : " 80 else [ -f "$1" ] || usage "Le premier argument n est pas un fichier" 81 [ -f "$2" ] || usage "Le second argument n est pas un fichier" 82 # Copie de sécurité du fichier à modifier cp $2 $2.old # Remplacement while read line do original="$(echo $line | cut -d\; -f1)" new="$(echo $line | cut -d\; -f2)" sed -i -e "s/${original}/${new}/g" $2 done < $1 # Pour supprimer les lignes sélectionnées au premier tour monNoeud = $(xmlstarlet select -t -m "/services-logiciel/mas/contrats/contrat/services/service" -v "@wsdl" -n $2 | grep suppr) if [ "$monNoeud" -e "suppr" ] then #La suppression en fonction du contenu de la variable xmlstarlet ed -d "/services-logiciel/mas/contrats/contrat/services/service [@wsdl='${monNoeud}']" $2 > $2 fi #ToDo : La possibilité que l'on doive supprimer plusieurs serveurs ??? fi #----------------------------------------------------------------------- # Fin #----------------------------------------------------------------------- exit 0
Cordialement,
Marco.