Ho un file XML con più elementi figlio che hanno lo stesso nome di tag, ad es. <Name>Luigi</Name>
, <Name>Mario</Name>
, <Name>Peach</Name>
. Ecco un mock-up di come appare il mio file di input:
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
Quando lancio questo file in Excel per l'analisi, viene creato un nuovo record per ogni Name
elemento. Questo è fantastico dal punto di vista della leggibilità, ma rende difficile discernere se ho molti dati duplicati al di fuori dei campi del nome.
Quello che voglio fare è rinominare i tag in Name1
, Name2
, Name3
in modo che appaiano tutti sulla stessa riga quando li importo in Excel. In questo modo sarò in grado di trovare record per me inutili o che contengono duplicati, senza dover guardare costantemente i dati grezzi.
In altre parole, voglio uno script o un comando che produca il seguente output:
<!-- names.xml -->
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
È possibile farlo con un sed comando o altro script Unix?
Risposta accettata:
Dal momento che hai chiesto espressamente sed
, ecco un sed
/bash
script che dovrebbe fare quello che vuoi, a condizione che ogni <Name>
l'elemento viene aperto e chiuso sulla stessa riga:
(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
L'ho testato con questo file di input:
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
E ha prodotto il seguente output:
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
Detto questo, questo sembra un buon candidato per un linguaggio con una libreria di analisi XML. Ecco uno script Python che fa quello che vuoi:
#!/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])
Esegui in questo modo:
python add_suffix.py names.xml new_names.xml