如何使用sed获取两个xml标签的值
问题描述:
我有一个xml文件,我想获取一些标签的值。 XML是这样如下:如何使用sed获取两个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
答
正确的方法是使用XML解析器等xmlstarlet:
在这种情况下,<DOCTYPE ..>
标签是多余的。
xmlstarlet sel -t -v '//X2/*[not(self::date_time)]' -n formated.xml
输出:
USA
XXXXXXXXXXXXXX
YYYYYYYYYYYYYY
ZZZZZZZZZZZZZZ
UAE
AAAAAAAAAAAAAA
BBBBBBBBBBBBBB
CCCCCCCCCCCCCC
答
串联两个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
+0
+1。理解sed非常重要,sed一次将输入流读入模式空间一行,在从模式空间读取下一行之前执行该输入行的每个命令。 sed管理sed不同于在一个sed调用中执行的一串sed命令。 – stevesliva
答
GNU sed的:
sed '/<X3>/{s/<[^>]*>//g;h};/ action=/{s/<[^>]*>//g;H};/<\/X2>/{g;b};d' formated.xml
请看看:什么时候有人回答我的问题,我应该怎么办?(HTTP://计算器.com/help/someone-answers) – Cyrus