我的 xml 文件采用以下格式。我想获取<fullName>..</fullName>
ABC 和 DEF 标签之间的值。我在 while 循环中编写此代码以到达每一行,因为我需要fullName
在另一个变量中获取每个 xml 标记的值。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