Saya memiliki file XML dengan beberapa elemen anak yang memiliki nama tag yang sama, mis. <Name>Luigi</Name>
, <Name>Mario</Name>
, <Name>Peach</Name>
. Berikut ini adalah contoh tampilan file input saya:
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
Ketika saya membuang file ini ke Excel untuk analisis, itu membuat catatan baru untuk setiap Name
elemen. Ini luar biasa dari perspektif keterbacaan, tetapi sulit untuk membedakan apakah saya memiliki banyak data duplikat di luar bidang nama.
Yang ingin saya lakukan adalah mengganti nama tag menjadi Name1
, Name2
, Name3
sehingga semuanya muncul di baris yang sama saat saya mengimpornya ke Excel. Dengan begitu saya akan dapat menemukan catatan yang tidak berguna bagi saya atau yang berisi duplikat – tanpa harus terus-menerus melihat data mentah.
Dengan kata lain, saya ingin skrip atau perintah yang menghasilkan output berikut:
<!-- names.xml -->
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
Apakah mungkin melakukan ini dengan sed perintah atau skrip Unix lainnya?
Jawaban yang Diterima:
Karena Anda secara khusus meminta sed
, ini adalah sed
/bash
skrip yang harus melakukan apa yang Anda inginkan, asalkan setiap <Name>
elemen dibuka dan ditutup pada baris yang sama:
(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
Saya mengujinya dengan file input ini:
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
Dan itu menghasilkan output berikut:
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
Yang mengatakan, ini sepertinya kandidat yang baik untuk bahasa dengan perpustakaan penguraian XML. Berikut adalah skrip Python yang melakukan apa yang Anda inginkan:
#!/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])
Jalankan seperti ini:
python add_suffix.py names.xml new_names.xml