我正在開發shell腳本和自動化,我想在不編寫更多代碼的情況下完成cetain任務。如何使用sed替換文件中的n個事件?
下面是Web服務的示例xml,我想要在每個段中更改startdate時點擊請求(Data.xml)。
意思是在第一次調用時,只有第一個標籤的startdate會被修改,其餘的startdate將會保持不變,依此類推。
我的方法是刪除所有換行符並在一行中形成整個xml,然後使用sed替換所需的出現位置。
我嘗試使用以下命令
cat Data.xml | awk '{ print $1}'| xargs echo | sed 's/<startdate>01011970<\/startdate>/<startdate>01011979<\/startdate>/2' | sed 's/> </>\n</g'
輸出:
<Data>
<First>
<Name>Micheal</Name>
<Account-Validation>
<startdate>01011970</startdate>
<enddate>01019999</enddate>
</Account-Validation>
</First>
<Second>
<Name>Adam</Name>
<Account-Validation>
<startdate>01011979</startdate>
<enddate>01019999</enddate>
</Account-Validation>
</Second>
<Third>
<Name>Raul</Name>
<Account-Validation>
<startdate>01011970</startdate>
<enddate>01019999</enddate>
</Account-Validation>
</Third>
</Data>
其中我看到的是它改變了整個XML格式的唯一問題。所以我正在尋找使用保持緩衝區和模式緩衝區方法來做同樣的事情。 這裏是樣本命令,
cat Data.xml | sed '{/<Second>/,/<\/Second>/g;s/<startdate>01011970<\/startdate>/<startdate>01011979<\/startdate>/p};h;
但上述方法無效,所以任何一個可以幫助我做到這一點使用保持緩衝器和模式的緩衝途徑。我看到使用這種方法的優點是您不需要計數沒有發生,您可以輕鬆地提供標記名稱,僅在要替換的startdate中。
data.xml中
<Data>
<First>
<Name>Micheal</Name>
<Account-Validation>
<startdate>01011970</startdate>
<enddate>01019999</enddate>
</Account-Validation>
</First>
<Second>
<Name>Adam</Name>
<Account-Validation>
<startdate>01011970</startdate>
<enddate>01019999</enddate>
</Account-Validation>
</Second>
<Third>
<Name>Raul</Name>
<Account-Validation>
<startdate>01011970</startdate>
<enddate>01019999</enddate>
</Account-Validation>
</Third>
</Data>
感謝, Priyank沙阿
您是否考慮過使用XSLT修改XML數據,因爲使用字符串替換通常會導致可能無法正常工作的複雜模式? – beny23 2013-04-30 08:04:14