我有这么长的一条线:
<hdr><name><first>John</first><mid></mid><last>Smith</last></name><dob>04181995</dob><phone>5550001111<phone></hdr>
如何提取以下内容?
<first>John</first>
<mid></mid>
<last>Smith</last>
<dob>04181995</dob>
<phone>5550001111<phone>
尝试过 sed 但获得额外的标签:
echo "<hdr><name><first>John</first><mid></mid><last>Smith</last></name><dob>04181995</dob><phone>5550001111<phone></hdr>" | sed -e 's/></>\n</g'
<hdr>
<name>
<first>John</first>
<mid>
</mid>
<last>Smith</last>
</name>
<dob>04181995</dob>
<phone>5550001111<phone>
</hdr>
也许 grep 可以做到。我搞不清楚了。请帮忙
答案1
您希望使用 XML 解析器(例如xmllint
XPath)来导航并选择所需的节点。
echo "<hdr><name><first>John</first><mid></mid><last>Smith</last></name><dob>04181995</dob><phone>5550001111</phone></hdr>" \
| xmllint --xpath 'hdr/name/* | hdr/dob | hdr/phone' -
答案2
使用 XML 解析器xmlstarlet
(修复损坏的phone
结束标记后):
$ xmlstarlet sel -t -m '/hdr' -c 'name/*' -c dob -c phone -nl file.xml
<first>John</first><mid/><last>Smith</last><dob>04181995</dob><phone>5550001111</phone>
首先匹配该/hdr
节点,然后继续挑选-c
该节点的每个子节点的副本( )name
,即 、first
、mid
和last
子节点。然后它还提取dob
和节点的副本phone
。