如何使用sed获取xml的两个标签的值

时间:2017-08-15 09:08:00

标签: xml sed tags

我有一个xml文件,我想获取一些标签的值。 XML就是这样的,如下所示:

<?xml version="1.0" standalone = "no"?>
<!DOCTYPE handover_list PUBLIC"EN""h">
<X1>
<X2>
<X3>USA</X3>
<date_time>20170813T18:18-04:00</date_time>
<id action="I">XXXXXXXXXXXXXX</id>
<id action="I">YYYYYYYYYYYYYY</id>
<id action="I">ZZZZZZZZZZZZZZ</id>
</X2>
<X2>
<X3>UAE</X3>
<date_time>20160814T15:15-03:04</date_time>
<id action="I">AAAAAAAAAAAAAA</id>
<id action="I">BBBBBBBBBBBBBB</id>
<id action="I">CCCCCCCCCCCCCC</id>
</X2>
</X1>

我使用的是:

sed -n 's:.*<X3>\(.*\)</X3>.*:\1:p' formated.xml
sed -n 's:.*<id action="I">\(.*\)</id>.*:\1:p' formated.xml

及其给定的输出如下:

USA
UAE
XXXXXXXXXXXXXX
YYYYYYYYYYYYYY
ZZZZZZZZZZZZZZ
AAAAAAAAAAAAAA
BBBBBBBBBBBBBB
CCCCCCCCCCCCCC

我想要的是合并上面使用的两个sed命令,这样我就可以得到这样的输出:

USA
XXXXXXXXXXXXXX
YYYYYYYYYYYYYY
ZZZZZZZZZZZZZZ
UAE
AAAAAAAAAAAAAA
BBBBBBBBBBBBBB
CCCCCCCCCCCCCC

3 个答案:

答案 0 :(得分:1)

将两个sed命令与一个;

连接起来
sed -n 's:.*<X3>\(.*\)</X3>.*:\1:p' formated.xml
sed -n 's:.*<id action="I">\(.*\)</id>.*:\1:p' formated.xml

一个sed命令:

sed -n 's:.*<X3>\(.*\)</X3>.*:\1:p; s:.*<id action="I">\(.*\)</id>.*:\1:p' formated.xml

输出:

USA
XXXXXXXXXXXXXX
YYYYYYYYYYYYYY
ZZZZZZZZZZZZZZ
UAE
AAAAAAAAAAAAAA
BBBBBBBBBBBBBB
CCCCCCCCCCCCCC

答案 1 :(得分:1)

正确的方法是使用像xmlstarlet这样的xml解析器:

在这种情况下,<DOCTYPE ..>标记是多余的。

xmlstarlet sel -t -v '//X2/*[not(self::date_time)]' -n formated.xml

输出:

USA
XXXXXXXXXXXXXX
YYYYYYYYYYYYYY
ZZZZZZZZZZZZZZ
UAE
AAAAAAAAAAAAAA
BBBBBBBBBBBBBB
CCCCCCCCCCCCCC

答案 2 :(得分:0)

GNU sed:

sed '/<X3>/{s/<[^>]*>//g;h};/ action=/{s/<[^>]*>//g;H};/<\/X2>/{g;b};d' formated.xml