我有一个任务,必须通过 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-name
com.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