J'ai un fichier XML avec plusieurs éléments enfants qui ont le même nom de balise, ex. <Name>Luigi</Name>
, <Name>Mario</Name>
, <Name>Peach</Name>
. Voici une maquette de ce à quoi ressemble mon fichier d'entrée :
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
Lorsque je lance ce fichier dans Excel pour analyse, il crée un nouvel enregistrement pour chaque Name
élément. C'est génial du point de vue de la lisibilité, mais il est difficile de discerner si j'ai beaucoup de données en double en dehors des champs de nom.
Ce que je veux faire, c'est renommer les balises en Name1
, Name2
, Name3
afin qu'ils apparaissent tous sur la même ligne lorsque je les importe dans Excel. De cette façon, je pourrai trouver des enregistrements qui ne me sont d'aucune utilité ou qui contiennent des doublons, sans avoir à consulter constamment les données brutes.
En d'autres termes, je veux un script ou une commande qui produit la sortie suivante :
<!-- names.xml -->
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
Est-il possible de le faire avec un sed commande ou autre script Unix ?
Réponse acceptée :
Puisque vous avez spécifiquement demandé sed
, voici un sed
/bash
script qui devrait faire ce que vous voulez, à condition que chaque <Name>
l'élément est ouvert et fermé sur la même ligne :
(IFS='';
n=0;
while read line; do
if echo "${line}" | grep -Pq "<Name>\w+</Name>"; then
((n++));
echo "${line}" | sed "s/<Name>\(\w\+\)<\/Name>/<Name${n}>\1<\/Name${n}>/";
else
echo "${line}";
fi;
done) < names.xml
Je l'ai testé avec ce fichier d'entrée :
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
Et il a produit la sortie suivante :
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
Cela dit, cela semble être un bon candidat pour un langage avec une bibliothèque d'analyse XML. Voici un script Python qui fait ce que vous voulez :
#!/usr/bin/env python2
# -*- encoding: ascii -*-
# add_suffix.py
import sys
import xml.etree.ElementTree
# Load the data
tree = xml.etree.ElementTree.parse(sys.argv[1])
root = tree.getroot()
# Update the XML tree
suffix = 0
for name in root.iter("Name"):
suffix += 1
name.tag += str(suffix)
# Write out the updated data
tree.write(sys.argv[2])
Exécutez-le comme ceci :
python add_suffix.py names.xml new_names.xml