![使用 sed 更改 XML 节点的值?](https://linux22.com/image/149952/%E4%BD%BF%E7%94%A8%20sed%20%E6%9B%B4%E6%94%B9%20XML%20%E8%8A%82%E7%82%B9%E7%9A%84%E5%80%BC%EF%BC%9F.png)
我在 XML 文档中有以下节点:
<client-version>1.2.8</client-version>
如何将节点的值 , 替换1.2.8
为1.2.9
?
想要的输出:
<client-version>1.2.9</client-version>
答案1
您可以使用 XML 解析器来执行此操作。例如xmlstarlet
(命令行 XML 工具):
$ xmlstarlet ed -u '//client-version' -v '1.2.9' file.xml
<?xml version="1.0"?>
<client-version>1.2.9</client-version>
上述命令将定位全部文档节点的出现次数client-version
并将其值更改为字符串1.2.9
。
要仅更改那些1.2.8
,您可以使用
xmlstarlet ed -u '//client-version[text() = "1.2.8"]' -v '1.2.9' file.xml
将输出重定向到新文件,检查它并将其重命名为原始文件名,或者xmlstarlet
使用其-L
或--inplace
选项运行以就地编辑文件。
使用xq
, 来自yq
, 来自https://kislyuk.github.io/yq/,它允许您使用jq
表达式来修改 XML 文档:
xq -x '(..|."client-version"? // empty) |= "1.2.9"' file.xml
client-version
这会将每个节点的值更新为1.2.9
无论它位于文档中的哪个位置。
1.2.9
可以从变量中插入字符串,如下所示:
new_version=1.2.9
xq -x --arg ver "$new_version" '(..|."client-version"? // empty) |= $ver' file.xml
答案2
尝试使用下面的 awk 命令,效果很好
awk '$0 ~ /^<client-version>/ && $0 ~ /<\/client-version>/{gsub("1.2.8","1.2.9",$0)}1' orginalfile >temperorayfile && mv temperorayfile orginalfile