Ajout d'une option en fin de section xml [Résolu/Fermé]

Signaler
Messages postés
13
Date d'inscription
jeudi 16 août 2018
Statut
Membre
Dernière intervention
17 juillet 2019
-
Messages postés
13
Date d'inscription
jeudi 16 août 2018
Statut
Membre
Dernière intervention
17 juillet 2019
-
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.

3 réponses

Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 092
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…

Messages postés
13
Date d'inscription
jeudi 16 août 2018
Statut
Membre
Dernière intervention
17 juillet 2019

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...
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 092
\#<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).
Messages postés
13
Date d'inscription
jeudi 16 août 2018
Statut
Membre
Dernière intervention
17 juillet 2019

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#
Messages postés
13
Date d'inscription
jeudi 16 août 2018
Statut
Membre
Dernière intervention
17 juillet 2019

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]*...
Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 092
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>
Messages postés
13
Date d'inscription
jeudi 16 août 2018
Statut
Membre
Dernière intervention
17 juillet 2019

Bonjour zipe31.

Je pensais effectivement au N.

Merci beaucoup et bonne journée.