Ajout d'une option en fin de section xml

Résolu/Fermé
LpS33 Messages postés 13 Date d'inscription jeudi 16 août 2018 Statut Membre Dernière intervention 17 juillet 2019 - 16 août 2018 à 10:07
LpS33 Messages postés 13 Date d'inscription jeudi 16 août 2018 Statut Membre Dernière intervention 17 juillet 2019 - 17 août 2018 à 08:09
Bonjour à tous,

Je souhaite ajouter une ligne en fin de section dans un fichier de configuration xml.

Exemple avec la section goals clean :

<goals>clean -Doption1
-Doption2</goals>


Je dois ajouter l'option 3 pour obtenir :

<goals>clean -Doption1
-Doption2
-Doption3</goals>


Je pensais utiliser sed.

Merci d'avance.
A voir également:

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
16 août 2018 à 10:27
Salut,

$ cat fich 
<goals>clean -Doption1
-Doption2</goals>
<goals>bad -Doption1
-Doption2</goals>


$ sed '\#<goals>clean#,\#</goals>#{s#</goals>#\n-Doption3&#}' fich 
<goals>clean -Doption1
-Doption2
-Doption3</goals>
<goals>bad -Doption1
-Doption2</goals>


Rajouter l'option "
-i
" si ça fait le job et si la version de sed le permet…

0
LpS33 Messages postés 13 Date d'inscription jeudi 16 août 2018 Statut Membre Dernière intervention 17 juillet 2019
16 août 2018 à 10:39
Bonjour Zipe31,

Merci beaucoup ! Ça fonctionne parfaitement !

Juste pour ma culture personnelle, peux-tu simplement m'expliquer le mécanisme de cette syntaxe ? Je me battais avec sed '/<goals>clean/ s/$/\n-Doption3/' mais ça l'ajoutait en deuxième ligne, pas avant la balise de fin...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
16 août 2018 à 12:23
\#<goals>clean#,\#</goals># {          
s#</goals>#\n-Doption3&#
}


En 1er lieu je cible un ensemble de ligne, délimité par un
/motif_départ/
et un
/motif_fin/
, le tout séparé par une virgule :
/motif_départ/,/motif_fin/

Comme ta balise
</goals>
contient un "/", j'ai préféré remplacer le séparateur par défaut (qui est un "/") par un croisillon (#), d'où la syntaxe un peu particulière.

Si cet ensemble de ligne est trouvé, on applique la/les commande(s) située(s) entre les accolades :
s#</goals>#\n-Doption3&#

À savoir :
On substitue le motif "</goals>" par, successivement :
  • un saut de ligne (\n)
  • le motif à rajouter (-Doption3)
  • et pour finir l'ensemble du motif lui-même, ici symbolisé par le caractère esperluette (&) qui est un raccourci définissant la totalité du motif (ce qui empêche de le retaper inutilement).
0
LpS33 Messages postés 13 Date d'inscription jeudi 16 août 2018 Statut Membre Dernière intervention 17 juillet 2019
16 août 2018 à 13:33
Merci beaucoup ! J'avais fini par trouver :-) J'avais zappé le / dans ma balise de fin et je ne me souvenais pas qu'il fallait faire précéder le nouveau séparateur par un \ d'où le \#motif_depart#,\#motif_fin#
0
LpS33 Messages postés 13 Date d'inscription jeudi 16 août 2018 Statut Membre Dernière intervention 17 juillet 2019
16 août 2018 à 15:01
J'ai traité quasiment tous les cas de figures : avec ou sans espaces entre <goals> et clean.

Il me reste un cas qui me résiste : si <goals> et clean sont séparés par un retour à la ligne :
<goals>
clean -Doption1
-Doption2</goals>


J'ai testé [:space:]*, [ \t\n]*, [^c]*...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
16 août 2018 à 16:30
Là c'est un peu plus complexe, il faut d'abord tout regrouper sur une seule ligne (avec les sauts de lignes matérialisés (\n)) dans le buffer et ensuite appliquer la commande de substitution.

$ cat fich 
<goals>clean -Doption1
-Doption2</goals>
<goals>bad -Doption1
-Doption2</goals>
<goals>
clean -Doption1
-Doption2</goals>


$ sed '/<goals>/{:z;N;\#</goals>#!bz;/<goals>[ \n]*clean/{s#</goals>#\n-Doption3&#}}' fich
<goals>clean -Doption1
-Doption2
-Doption3</goals>
<goals>bad -Doption1
-Doption2</goals>
<goals>
clean -Doption1
-Doption2
-Doption3</goals>
0
LpS33 Messages postés 13 Date d'inscription jeudi 16 août 2018 Statut Membre Dernière intervention 17 juillet 2019
17 août 2018 à 08:09
Bonjour zipe31.

Je pensais effectivement au N.

Merci beaucoup et bonne journée.
0