2016-09-23 11 views
1

我有巨大的xml文件。我想匹配特定的字符串並刪除整個相關標籤示例XML使用sed移除「set of xml tag」

<server> 
    <servlet-name>default</servlet-name> 
    <servlet-class>servlets.DefaultServlet</servlet-class> 
    <init-param> 
     <param-name>debug</param-name> 
     <param-value>0</param-value> 
    </init-param> 
    <init-param> 
     <param-name>listings</param-name> 
     <param-value>false</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</server> 

在該XML我想匹配的3件事<server>..<servlet-name>default</servlet-name>....</server>。如果它匹配3個東西刪除整個事情。我試過下面的sed命令。

sed -i '/server/,/server/ d' web1.xml 

所以在這個東西斷絕切斷整個事情將被刪除。但我想匹配的3件事也default像下面的命令

sed -i '/server/,/webnav/,/server/ d' web1.xml 

這個命令不工作,但我想喜歡這個

+3

使用'xml'感知的工具,而不是'sed' – Inian

+0

@Inian這是什麼XML工具,我不知道。 – SSN

+0

查看http://xmlstar.sourceforge.net/source.php – Inian

回答

2

正如mentionned在您的意見,戰略經濟對話不是用於解析XML的工具。

話雖這麼說,如果你沒有選擇,你可以試試這個(風險自擔):<server></server>之間

sed '/<server>/{:a;/<\/server>/!{N;ba;}};/<servlet-name>default<\/servlet-name>/d;' web1.xml 

行合併,然後如果字符串<servlet-name>default</servlet-name>發現刪除。

說明:

  • /<server>/:如果<server>發現
  • :a:標籤a for循環來
  • /<\/server>/!:如果</server>未發現:
  • N:追加下一行圖案空間
  • ba:循環到:a標籤
  • /<servlet-name>default<\/servlet-name>/:循環結束時,在模式空間中搜索字符串<servlet-name>default</servlet-name>。如果發現:
  • d:清潔模式空間(即刪除所有來自<server></server>
+0

感謝您的代碼此代碼工作好的,我是sed的新手,你能解釋一下這個代碼嗎? – SSN

+0

@SatheeshSivaNallathambi我編輯了我的答案 – SLePort

+0

如果有些時候服務器或服務器映射也是那時候我試過編輯你的代碼就像這個'/ <(server | server-mapping)>/{:a;/<\ /(server | server-mapping)> /!{N; ba;}} ..'但它無法幫助我 – SSN