Ajout d'une option en fin de section xml

Résolu
LpS33 Messages postés 13 Date d'inscription   Statut Membre Dernière intervention   -  
LpS33 Messages postés 13 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention  
 
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   Statut Contributeur Dernière intervention   6 431
 
\#<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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention  
 
Bonjour zipe31.

Je pensais effectivement au N.

Merci beaucoup et bonne journée.
0