使用 sed 更改 XML 节点的值?

使用 sed 更改 XML 节点的值?

我在 XML 文档中有以下节点:

<client-version>1.2.8</client-version>

如何将节点的值 , 替换1.2.81.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 

相关内容