2013-03-19 19 views
0

我想對兩個xml文件做一個diff,但忽略2-3行模式。如何使用diff排除多行模式?

例如:說我想忽略可用性&價格,同時比較下面的xml格式。

這是我到目前爲止有:

diff -I '^<PRICE>*' 1.xml 2.xml 

<CATALOG> 

    <PLANT> 
    <COMMON>Bloodroot</COMMON> 
    <BOTANICAL>Sanguinaria canadensis</BOTANICAL> 
    <ZONE>4</ZONE> 
    <LIGHT>Mostly Shady</LIGHT> 
    <PRICE>$2.44</PRICE> 
    <AVAILABILITY>031599</AVAILABILITY> 
    </PLANT> 
</CATALOG> 

使用上述差異,它跳過了價格,但我怎麼添加可用性這個正則表達式?

回答

0

通過grep -v運行文件刪除你不需要的線,然後diff它們,如下圖所示:

diff <(grep -vE "^(<PRICE>|<AVAILABILITY>)" 1.xml) <(grep -vE "^(<PRICE>|<AVAILABILITY>)" 2.xml) 

<(...)語法稱爲Process Substitution。如果你的shell不支持它,你將不得不使用臨時文件,就像這樣:

$ grep -vE "^(<PRICE>|<AVAILABILITY>)" 1.xml > 1.new.xml 
$ grep -vE "^(<PRICE>|<AVAILABILITY>)" 2.xml > 2.new.xml 
$ diff 1.new.xml 2.new.xml 

我不認爲diff -I可以使用多種模式一起使用。

+0

我檢查了這一點。與此同時,上述差異似乎也適用於內容更改。不同的價格被忽略。 – user2186138 2013-03-19 11:17:32

+0

獲取「缺少重定向名稱」。 – user2186138 2013-03-19 11:21:30

+0

你使用bash嗎? – dogbane 2013-03-19 11:23:22

3

您是否嘗試過使用-I?

這個工作對我來說:

diff -I 'PRICE' -I 'AVAILABILITY' 1.xml 2.xml 
+0

這適用於Mac OS 10.10.5上的我。 – 2016-01-03 17:04:35

+0

小心:如果一個文件有2個差異,而你只用-I排除這兩個模式中的1個,那麼差異輸出將顯示BOTH差異,而不僅僅是你沒有要求它排除的差異。這可能會使它看起來像 - 我不工作,即使它是。 – 2016-01-03 17:06:28