GNU/Linux >> Tutoriels Linux >  >> Linux

Ajouter des suffixes numériques aux noms de balises pour distinguer les éléments XML ?

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

Linux
  1. Ajouter un nouveau service à Linux systemd

  2. La redirection vers un nom de fichier global échoue ?

  3. Nom de connexion :pas de nom de connexion ?

  4. Éléments séparés des mots Camelcase ?

  5. Tester nginx sans nom de domaine

Comment installer Jenkins sur Kubernetes

Ajout d'un émulateur de terminal supplémentaire sous Linux

Tableaux dans les scripts shell

Ajout d'une section au fichier ELF

Changer le nom du processus sous Linux

wget :nom du fichier téléchargé