2017-10-16 64 views
-1

替換XML值我有以下XML數據:在bash在linux

<info> 
    <data> 
     <name>my_image</name> 
     <value>site.com/image1.img</value> 
    </data> 
    <data> 
     <name>my_link</name> 
     <value>site.com/p_info</value> 
    </data> 
</info> 

我要全部更換site.com到siteimag.com每my_image值(只爲my_image屬性)的。

那麼結果將是:

<info> 
    <data> 
     <name>my_image</name> 
     <value>siteimag.com/image1.img</value> 
    </data> 
    <data> 
     <name>my_link</name> 
     <value>site.com/p_info</value> 
    </data> 
</info> 

如何將其與sed命令來完成?

謝謝。

+0

有sed的解析XML是壞主意 – RomanPerekhrest

回答

1
sed '/my_image/{n;s/site.com/siteimag.com/}' file 

簡要說明,

  • /my_image/:搜索一行包含 「my_image」
  • 一旦字符串搜索,
    • 通過使用命令n讀取下一行。
    • s/site.com/siteimag.com/:做替代
1

同一個XML文檔可以寫,在許多不同的方式格式化, 因此用sed簡單的文字工具來更新它,將是非常脆弱的,容易打破。

例如只是添加namevalue之間的空行,將打破天真sed上面的腳本:

<data> 
    <name>my_image</name> 

    <value>site.com/image1.img</value> 
</data> 

它也不能真正遵循XML結構,並會簡單地更換任何site.com參考,如果在一個my_image模式它上面的線,即使是在一個註釋:

<data> 
    <name>my_link</name> <!-- Used to be "my_image" --> 
    <value>site.com/p_info</value> 
</data> 

有數以百計的其他方式,源XML可以被修改,而不會改變它的意義,使之破壞或導致虛假的替代品。

爲避免這種情況,您應該使用支持XML的工具來進行替換,例如, xmlstarlet

xmlstarlet ed \ 
-u "//data/name[text()='my_image']/../value" \ 
-x "concat(substring-before(.,'site.com'),'sitemag.com',substring-after(.,'site.com'))"| 
data.xml 
0

使用XML解析器的正確方法類似xmlstarlet

xmlstarlet ed -u "//data/name[text()='my_image']/following-sibling::value" \ 
-v "$(sed 's/site/&imag/' <(xmlstarlet sel -t -v "//data/name[text()='my_image']/following-sibling::value" file.xml))" file.xml 

輸出:

<?xml version="1.0"?> 
<info> 
    <data> 
    <name>my_image</name> 
    <value>siteimag.com/image1.img</value> 
    </data> 
    <data> 
    <name>my_link</name> 
    <value>site.com/p_info</value> 
    </data> 
</info>