私のXMLファイルの形式は次のとおりです。<fullName>..</fullName>
ABCとDEFタグの間の値を取得したいです。fullName
別の変数から各xmlタグの値を取得する必要があるため、各行に到達するために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
次の 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