【问题标题】:how to get value of two tags of xml using sed如何使用 sed 获取 xml 的两个标签的值
【发布时间】:2018-01-23 04:40:13
【问题描述】:

我有一个 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

【问题讨论】:

    标签: xml sed tags


    【解决方案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
    

    输出:

    美国 XXXXXXXXXXXXXXX YYYYYYYYYYYYYY ZZZZZZZZZZZZZZ 阿联酋 啊啊啊啊啊 BBBBBBBBBBBBBB CCCCCCCCCCCCCC

    【讨论】:

    • +1。重要的是要了解 sed 一次将输入流读入模式空间一行,在从模式空间读取下一行之前执行该输入行的每个命令。 sed 通过管道传输到 sed 不同于在一次 sed 调用中执行的一串 sed 命令。
    【解决方案2】:

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

    在这种情况下,&lt;DOCTYPE ..&gt; 标签是多余的。

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

    输出:

    USA
    XXXXXXXXXXXXXX
    YYYYYYYYYYYYYY
    ZZZZZZZZZZZZZZ
    UAE
    AAAAAAAAAAAAAA
    BBBBBBBBBBBBBB
    CCCCCCCCCCCCCC
    

    【讨论】:

      【解决方案3】:

      GNU sed:

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

      【讨论】:

        猜你喜欢
        • 2015-01-01
        • 2016-10-23
        • 1970-01-01
        • 1970-01-01
        • 2015-12-20
        • 1970-01-01
        • 1970-01-01
        • 2014-11-13
        • 1970-01-01
        相关资源
        最近更新 更多