GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Numerische Suffixe zu Tag-Namen hinzufügen, um Xml-Elemente zu unterscheiden?

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

Linux
  1. Hinzufügen eines neuen Dienstes zu Linux systemd

  2. Anmeldename:Kein Anmeldename?

  3. Ändern Sie den Benutzernamen unter Linux

  4. Entfernen Sie einen symbolischen Link zu einem Verzeichnis

  5. Ändern Sie den Prozessnamen in Linux

So installieren Sie Jenkins auf Kubernetes

Hinzufügen eines zusätzlichen Terminalemulators in Linux

Die Umleitung zu einem globbed-Dateinamen schlägt fehl?

Separate Elemente von Camelcase-Wörtern?

Arrays in Shell-Skripten

Wie identifiziere ich einen Port zu einem Prozess?