在 Linux 中替换 bash 中的 XML 值

ise*_*eif 4 linux bash sed

我有以下 XML 数据:

<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>
Run Code Online (Sandbox Code Playgroud)

我想将每个 my_image 值的所有 site.com 替换为 siteimag.com (仅适用于 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>
Run Code Online (Sandbox Code Playgroud)

如何用 sed 命令完成呢?

谢谢。

CWL*_*Liu 5

sed '/my_image/{n;s/site.com/siteimag.com/}' file
Run Code Online (Sandbox Code Playgroud)

简要说明,

  • /my_image/:搜索包含“my_image”的行
  • 一旦搜索到字符串,
    • 使用命令读取下一行n
    • s/site.com/siteimag.com/: 进行替换


Rom*_*est 5

正确的方法是使用 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
Run Code Online (Sandbox Code Playgroud)

输出:

<?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>
Run Code Online (Sandbox Code Playgroud)