Ich habe eine XML-Datei mit mehreren untergeordneten Elementen, die denselben Tag-Namen haben, z. <Name>Luigi</Name>
, <Name>Mario</Name>
, <Name>Peach</Name>
. Hier ist ein Modell, wie meine Eingabedatei aussieht:
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
Wenn ich diese Datei zur Analyse in Excel werfe, erstellt sie einen neuen Datensatz für jeden Name
Element. Aus Sicht der Lesbarkeit ist das großartig, aber es macht es schwierig zu erkennen, ob ich viele doppelte Daten außerhalb der Namensfelder habe.
Ich möchte die Tags in Name1
umbenennen , Name2
, Name3
sodass sie alle in derselben Zeile erscheinen, wenn ich sie in Excel importiere. So finde ich Datensätze, die für mich unbrauchbar sind oder Duplikate enthalten – ohne ständig auf die Rohdaten schauen zu müssen.
Mit anderen Worten, ich möchte ein Skript oder einen Befehl, der die folgende Ausgabe erzeugt:
<!-- names.xml -->
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
Ist es möglich, dies mit einem sed zu tun Befehl oder ein anderes Unix-Skript?
Akzeptierte Antwort:
Da Sie ausdrücklich nach sed
gefragt haben , hier ist ein sed
/bash
Skript, das tun sollte, was Sie wollen, vorausgesetzt, dass jeder <Name>
Element wird in derselben Zeile geöffnet und geschlossen:
(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
Ich habe es mit dieser Eingabedatei getestet:
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
Und es erzeugte die folgende Ausgabe:
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
Dies scheint jedoch ein guter Kandidat für eine Sprache mit einer XML-Parsing-Bibliothek zu sein. Hier ist ein Python-Skript, das tut, was Sie wollen:
#!/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])
Führen Sie es so aus:
python add_suffix.py names.xml new_names.xml