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