web-dev-qa-db-ja.com

シェルスクリプト-xml内のタグ間の値を取得します

私のxmlファイルは以下の形式です。 ABCとDEFの<fullName>..</fullName>タグの間の値を取得したい。各xmlタグのfullNameの値を別の変数に取り込む必要があるため、これをwhileループで記述して各行に到達します。 grepは、すべての値を一緒に表示します。

ありがとう

<fields>
    <fullName>ABC</fullName>
    <trackFeedHistory>false</trackFeedHistory>
    <type>TY</type>
</fields>

<fields>
    <fullName>DEF</fullName>
    <trackFeedHistory>false</trackFeedHistory>
    <type>XY</type>
</fields>
1
user343860

Xmlパーサーを使用します。例: xmlstarlet

xmlstarlet sel -t -m '//fields' -v 'fullName' -n file

xmlファイルは有効である必要があることに注意してください。これは、ルートタグが欠落しているための例ではありません。以下は上記のコマンドで動作します:

<root>
<fields>
    <fullName>ABC</fullName>
    <trackFeedHistory>false</trackFeedHistory>
    <type>TY</type>
</fields>

<fields>
    <fullName>DEF</fullName>
    <trackFeedHistory>false</trackFeedHistory>
    <type>XY</type>
</fields>
</root>

出力:

ABC
DEF

@roaimasのコメントのおかげで、フィールドの数を知らなくても、forの結果を使用してxmlstarletループを作成しました。

numFields=$(xmlstarlet sel -t -m '//fields' -o "." file | wc -c)
for i in $(seq 1 $numFields); do
    var=$(xmlstarlet sel -t -m "//fields[$i]" -v "fullName" file)
    printf '%s\n' "$var" # or do something else
done
4
pLumo