2016-11-26 81 views
-1

我想從我的扁平化的XML文件中刪除一個節點,我的XML文件包含以下內容的XML文件:刪除節點與sed的

... 
<cellule ref="1111"/> 
</blah> 
<workdocument id="bar" classement="1"/> 
<tablau id="35"> 
<cellule ref="1250"/> 
<area id="foo"> 
<subarea>Ipsum Lorem Dolor</subarea> 
<area> 
... 

我需要刪除<workdocument id="bar" classement="1"/>,所以從元素<workdocument直到正在關閉 「/>

我試着用SED如下:

echo '<cellule ref="1111"/></blah><workdocument id="bar" classement="1"/><tablau id="35"><cellule ref="1250"/><area id="foo"><subarea>Ipsum Lorem Dolor</subarea><area>' |sed 's/<workdocument.*\/>//' 
<cellule ref="1111"/></blah><area id="foo"><subarea>Ipsum Lorem Dolor</subarea><area> 

<cellule ref="1250"/><area id="foo">也將被刪除:/

請注意,屬性classement的價值是不知道:/

謝謝

+3

使用sed或類似工具處理XML(或其他結構化數據)通常不是一個好主意。你的輸入仍然是有效的XML嗎?您可能希望查看XML處理工具,如xmlstarlet。在這種情況下:'xmlstarlet ed -d // workdocument file.xml' – Wintermute

+0

嗨,謝謝,是的,它仍然有效,爲什麼我試圖使用sed反而是因爲我將在bash腳本中使用它,而我不確定xmlstarlet是否安裝在所有機器上。 – Zatla00

+2

捆綁它,這是我的建議。或者依賴於像python這樣的東西,它無處不在,並且在其標準庫中有XML處理。使用sed處理XML的問題是,突然輸入是有效的XML是不夠的,它必須是XML,它的格式可以通過腳本可以處理的方式進行。例如,如果我在' Wintermute

回答

2

試試這個:sed 's/<workdocument[^\/]*\/>//'

這使用[^/]*而不是.*workdocument後,使其匹配不超過第一個/>[^/]/以外的其他字符匹配。

+0

它很好地工作謝謝你,請你給一些使用的語法的解釋? – Zatla00

+0

新增說明。是否有意義?我不是在英語寫作很不錯... – kaitoy

+0

謝謝你,現在是爲我好! – Zatla00