同じタグ名を持つ複数の子要素を含むXMLファイルがあります。
、<名前>マリオ名前>コード> 、
。これが私の入力ファイルがどのように見えるかのモックアップです:
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
このファイルを分析のためにExcelにスローすると、 Name
ごとに新しいレコードが作成されます。 エレメント。これは読みやすさの観点からは素晴らしいですが、名前フィールドの外に重複データがたくさんあるかどうかを識別するのは困難です。
私がやりたいのは、タグの名前を Name1
に変更することです 、 Name2
、 Name3
Excelにインポートしたときにすべて同じ行に表示されるようにします。そうすれば、生データを常に確認しなくても、自分にとって役に立たないレコードや重複を含むレコードを見つけることができます。
つまり、次の出力を生成するスクリプトまたはコマンドが必要です。
<!-- names.xml -->
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
sed でこれを行うことは可能ですか? コマンドまたは他のUnixスクリプト?
承認された回答:
sed
を具体的に要求したので 、ここに sed
があります / bash
各
があれば、あなたが望むことをするはずのスクリプト 要素は同じ行で開閉されます:
(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
この入力ファイルでテストしました:
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
そして、次の出力を生成しました:
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
そうは言っても、これはXML解析ライブラリを備えた言語の良い候補のようです。これがあなたが望むことをするPythonスクリプトです:
#!/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])
次のように実行します:
python add_suffix.py names.xml new_names.xml