XML打印Bash中的每一行
我有一个API,工作良好。我提取的XML数据如下所示:XML打印Bash中的每一行,xml,bash,xml-parsing,Xml,Bash,Xml Parsing,我有一个API,工作良好。我提取的XML数据如下所示: <?xml version="1.0" encoding="UTF-8"?> <buildings> <size> 7 </size> <building> <id> 1 </id> <name> Firs
<?xml version="1.0" encoding="UTF-8"?>
<buildings>
<size>
7
</size>
<building>
<id>
1
</id>
<name>
First Building
</name>
</building>
<building>
<id>
2
</id>
<name>
Second Building
</name>
</building>
</buildings>
我试过:
IDS=$(*fullcommand* | awk -F'>|<' '/<name>/ {print $3}')
printf '%s\n' $IDS
任何帮助都会很棒。
如果您想在name和/name之间切换,谢谢
sed -n '/<name>/,/<\/name>/p' | grep -v '^ *<' | sed 's/^ *//'
输出:
First Building
Second Building
不要使用awk来解析某些XML,但可以看看任何XML解析器,如xmlint或xmlstarlet。它们使用非常强大的类似正则表达式的表达式,称为XPath。这样,您将100%健壮。请在引号中加上$id。一般来说,你应该总是引用变量,除非你有很好的理由不引用。我是一个noob。尝试这种健壮的方式:$xmlstarlet sel-t-m//Building-v name-n file.xml equallanent:。使用xmlparser的原因是,对fullcommand的更新可能会创建格式不同的XML输出,而命令可能会失败。这是否回答了您的问题?我建议使用XML/HTML解析器xmlstarlet、xmllint……这样更好,但这取决于用户2720970想要什么。
sed -n '/<name>/,/<\/name>/p' | grep -v '^ *<' | sed 's/^ *//'
xmlstarlet select --template --match '//name' --value-of 'normalize-space()' -n file
First Building
Second Building