GNU/Linux >> Znalost Linux >  >> Linux

Přidávání číselných přípon k názvům značek pro rozlišení prvků XML?

Mám soubor XML s více podřízenými prvky, které mají stejný název značky, např. <Name>Luigi</Name> , <Name>Mario</Name> , <Name>Peach</Name> . Zde je maketa toho, jak můj vstupní soubor vypadá:

<!-- names.xml -->
<Names>
    <Name>Luigi</Name>
    <Name>Mario</Name>
    <Name>Peach</Name>
</Names>

Když hodím tento soubor do Excelu k analýze, vytvoří se nový záznam pro každý Name živel. To je úžasné z hlediska čitelnosti, ale ztěžuje to rozeznat, jestli mám spoustu duplicitních dat mimo pole jmen.

Chci přejmenovat značky na Name1 , Name2 , Name3 aby se všechny zobrazily na stejném řádku, když je importuji do Excelu. Budu tak moci najít záznamy, které jsou mi k ničemu nebo které obsahují duplikáty – aniž bych se musel neustále dívat na nezpracovaná data.

Jinými slovy, chci skript nebo příkaz, který vytvoří následující výstup:

<!-- names.xml -->
<Names>
    <Name1>Luigi</Name1>
    <Name2>Mario</Name2>
    <Name3>Peach</Name3>
</Names>

Je možné to udělat pomocí sed příkaz nebo jiný unixový skript?

Přijatá odpověď:

Protože jste konkrétně požádali o sed , zde je sed /bash skript, který by měl dělat to, co chcete, za předpokladu, že každý <Name> prvek se otevírá a zavírá na stejném řádku:

(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

Testoval jsem to s tímto vstupním souborem:

<!-- names.xml -->
<Names>
    <Name>Luigi</Name>
    <Name>Mario</Name>
    <Name>Peach</Name>
</Names>

A vytvořil následující výstup:

<Names>
    <Name1>Luigi</Name1>
    <Name2>Mario</Name2>
    <Name3>Peach</Name3>
</Names>

To znamená, že to vypadá jako dobrý kandidát na jazyk s knihovnou pro analýzu XML. Zde je skript Pythonu, který dělá, co chcete:

#!/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])

Spusťte to takto:

python add_suffix.py names.xml new_names.xml

Linux
  1. Selhalo přesměrování na název souboru Globbed?

  2. Přihlašovací jméno:Žádné přihlašovací jméno?

  3. Samostatné prvky slov Camelcase?

  1. Přidání IP adresy na Windows Server

  2. Změňte uživatelské jméno v systému Linux

  3. Změňte název procesu v Linuxu

  1. Rackspace jmenné servery

  2. Testování nginx bez názvu domény

  3. Jak identifikovat port k procesu?