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 -
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 :
Je dois ajouter l'option 3 pour obtenir :
Je pensais utiliser sed.
Merci d'avance.
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:
- Ajout d'une option en fin de section xml
- Xml download - Télécharger - Édition & Programmation
- Fin des zfe - Guide
- Saut de section word - Guide
- Fin de la 4g en france - Accueil - Guide opérateurs et forfaits
- Supprimer une section ✓ - Forum Word
3 réponses
Salut,
Rajouter l'option "
$ 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…
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...
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...
\#<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).
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 :
J'ai testé [:space:]*, [ \t\n]*, [^c]*...
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]*...
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>