2017-08-15 89 views
0

我有一個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 
+0

請看看:什麼時候有人回答我的問題,我應該怎麼辦?(HTTP://計算器.com/help/someone-answers) – Cyrus

回答

1

正確的方法是使用XML解析器等xmlstarlet

在這種情況下,<DOCTYPE ..>標籤是多餘的。

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

輸出:

USA 
XXXXXXXXXXXXXX 
YYYYYYYYYYYYYY 
ZZZZZZZZZZZZZZ 
UAE 
AAAAAAAAAAAAAA 
BBBBBBBBBBBBBB 
CCCCCCCCCCCCCC 
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 
+0

+1。理解sed非常重要,sed一次將輸入流讀入模式空間一行,在從模式空間讀取下一行之前執行該輸入行的每個命令。 sed管理sed不同於在一個sed調用中執行的一串sed命令。 – stevesliva

0

GNU sed的:

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