GNU/Linux >> Linux の 問題 >  >> Linux

Xml要素を区別するためにタグ名に数値のサフィックスを追加しますか?

同じタグ名を持つ複数の子要素を含むXMLファイルがあります。 Luigi <名前>マリオ Peach 。これが私の入力ファイルがどのように見えるかのモックアップです:

<!-- 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

Linux
  1. XML 属性の検索 PowerShell XPath

  2. Linuxでスレッドに名前を付ける方法は?

  3. Linux でプロセス名を変更する

  1. wget:ダウンロードしたファイル名

  2. プロセスへのポートを識別する方法は?

  3. 同じ行で数値表記を使用して許可を削除および追加する

  1. Linuxsystemdに新しいサービスを追加する

  2. Globbedファイル名へのリダイレクトが失敗しますか?

  3. ログ名:ログイン名がありませんか?