私の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>
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