使用 sed 命令搜索并替换 XML 文件中的特定标记值

使用 sed 命令搜索并替换 XML 文件中的特定标记值

我有一个任务,必须通过 bash shell 脚本操作 XML 文件。

步骤如下:

  • 查询 XML 文件的值。
  • 将不同元素的值替换为新值。

这是示例 xml:

<context-param>
    <param-name>com.sun.faces.sendPoweredByHeader</param-name>
    <param-value>false</param-value>
  </context-param>
  <context-param>
    <param-name>com.sun.faces.numberOfViewsInSession</param-name>
    <param-value>25</param-value>
  </context-param>
  <context-param>
    <param-name>testing</param-name>
    <param-value>25</param-value>
  </context-param>

我需要 使用 shell 脚本将 的 parm 值更新<param-value>25</param-value>为。<param-value>3</param-value>

知道仅更新参数名称()的参数值的 SED 命令是什么吗<param-name>com.sun.faces.numberOfViewsInSession</param-name>

我尝试使用以下命令,

sed -i 's/<param-value>25<\/param-value>/<param-value>3<\/param-value>/' test.xml

但此命令将更新所有参数值。我只需要更新 com.sun.faces.numberOfViewsInSession

答案1

使用 XMLStarlet,并假设文档有一个根节点:

xmlstarlet ed \
    -u '//context-param[param-name = "com.sun.faces.numberOfViewsInSession"]/param-value[. = 25]' \
    -v 3 file.xml

这将选择正确的param-value节点(值为 25 的节点([. = 25]如果旧值不重要,则删除该位),并且是其子节点值为context-param的节点的子节点),并将其值更改为 3。param-namecom.sun.faces.numberOfViewsInSession

生成的文档将是(root插入一个假节点):

<?xml version="1.0"?>
<root>
  <context-param>
    <param-name>com.sun.faces.sendPoweredByHeader</param-name>
    <param-value>false</param-value>
  </context-param>
  <context-param>
    <param-name>com.sun.faces.numberOfViewsInSession</param-name>
    <param-value>3</param-value>
  </context-param>
  <context-param>
    <param-name>testing</param-name>
    <param-value>25</param-value>
  </context-param>
</root>

答案2

sed -i 's#<param-value>25</param-value>#<param-value>3</param-value>#' test.xml

答案3

使用下面的 sed 命令,我们可以更新特定的标记值:-

sed -i '/<param-name>com.sun.faces.numberOfViewsInSession<\/param-name>/{n;s/<param-value>3<\/param-value>/<param-value>25<\/param-value>/}' test.xml

相关内容