-2

次の出力があります

<computers><size>5</size><computer><id>1</id><name>NSK1210050726M</name></computer><computer><id>2</id><name>nsk1200015739m</name></computer><computer><id>3</id><name>SFO1502083053M</name></computer><computer><id>5</id><name>nsk1501817326m</name></computer><computer><id>8</id><name>nsk1501901173m</name></computer></computers>

シェルスクリプトを使用して、タグ内の名前のみを取得したいと思います。

どうすればこれを達成できますか?

4

2 に答える 2

1

XMLの解析と変更については、 XMLStarletコマンドラインツールキットを確認する必要があります。

上記の場合、文字エンコード、エンティティなどを尊重して、テキストを引き出すためのXPathを指定できます。

$ xmlstarlet sel -t -v "//name" x.xml    

コンピュータ名のリストが表示されます(XMLがにあると仮定しますx.xml)。したがって、これらをより適切にフォーマットできます。

$ xmlstarlet sel -t -m  "//name" -v "translate(.,'&#10;','')" -n x.xml
于 2012-08-07T15:33:25.533 に答える
1

たとえば、xmlがシェル変数内にある場合は、$XMLシェルパラメーターの置換と単純なループを使用して、それを解析するという非常に悪い仕事をすることができます。

XML='<computers><size>5</size><computer><id>1</id><name>NSK1210050726M</name></computer><computer><id>2</id><name>nsk1200015739m</name></computer><computer><id>3</id><name>SFO1502083053M</name></computer><computer><id>5</id><name>nsk1501817326m</name></computer><computer><id>8</id><name>nsk1501901173m</name></computer></computers>'
match=0
for word in ${XML//[<>]/ }; do
    if [ $match -eq 1 ]; then
        echo $word
        match=0
    elif [ $word = "name" ]; then
        match=1
    fi
done

しかし、実際には、@BrianAgnewによって提案されたxmlstarletのようなものを使用する方がはるかに優れたアイデアです。

于 2012-08-07T16:11:57.440 に答える