2017-05-09 106 views
1

我是sed的新手,無法通過某些XML代碼查找和替換XML標記之間的多行XML代碼。下面是XML代碼使用sed替換XML多行標記中的文本

<List> 
    <User> 
     <Id>1234</Id> 
     <Info> 
      <Id>11</Id> 
     </Info> 
    </User> 
</List> 

我要替換列表標籤成爲之間的XML代碼..

<List> 
    <Replace> 
    <Id> 223 <Id> 
    </Replace> 
</List> 

我用 sed "s/\(<Id>\).*\(<\/Id\)/\19999\2/" input.xml > output.xml但其單線工作,但不是多線樣本。 List標籤之間的內容可能會改變,也可能是內聯的,所以不能根據特定的模式進行回覆,但只需要依賴標籤。任何幫助或指針將不勝感激?

+2

不使用正則表達式來分析xml。看到這篇文章http://stackoverflow.com/questions/9200462/simplest-way-to-do-basic-xml-parsing-from-unix-command-line – Lynch

+1

在bash/awk中處理XML不是最好的(即最強大/最安全)的方式,但可能爲個人/調試目的提供快速和骯髒的解決方案。所以,你可能會考慮這些Q/As:[SO:使用來自源文件的數據從XML文件中獲取塊](http://stackoverflow.com/questions/43642559/get-a-block-from-an- xml-file-using-data-from-a-source-file/43704602?s = 1 | 0.0000#43704602),[SO:Shell腳本 - 將xml分成多個文件](http://stackoverflow.com/questions/ 42625786 /殼腳本系分割XML - 到 - 多文件/ 42626222 S = 6 |?0.0000#42626222)。 – Scheff

回答

0

如果你真的想忽略林奇的忠告,這會做,但你將需要重新美化它:

sed -e ':a;N;$!ba' -e 's#<List.*</List>#<List>\n<Replace>\n<Id> 223 <Id>\n</Replace>\n</List>#' input.xml > output.xml 

它可能需要sed的GNU版本。