$ xmlstarlet edit --update '//project/version' --value '3.0.4' file.xml
<?xml version="1.0"?>
<project>
<version>3.0.4</version>
<dependencies>
<dependency>
<version>1.2.5.RELEASE</version>
</dependency>
</dependencies>
</project>
这个 sed 应该做:
sed "/<version>/s/>.*</>${var2}</" pom.xml
<project>
<version>3.0.4</version>
</project>
它搜索带有
<version>
的行,然后替换 >xxx< with the variable. 之间的数据
使用正则表达式,您可以确保要查找的内容不会太多。
sed -E "/<version>/s/>[^<]+</>${var2}</" pom.xml
如果您需要确保它不会更改除
version
之后的其他project
,您可以使用awk
awk -v var=$var2 '/<project>/ {f=1} f && /<version>/ {sub(/>[^<]+</,">"var"<")} 1' pom.xml
<project>
<version>3.0.4</version>
</project>
测试
project
并在下一行更改的 Sed 版本
sed -E '/<project>/!b;n;s/<version>[^<]+</<version>'$var2'</' pom.xml
<project>
<version>3.0.4</version>
</project>
xmlstarlet edit -P --inplace --update '/_:project/_:version' --value '3.0.0' pom.xml
_:
前缀背后的原因是,每个设置了 xmlns 属性的 XML 元素在引用时都应以命名空间为前缀,在提供的 pom.xml
文件的情况下,设置了 xmlns 属性,但命名空间为未指定,这将使 xmlstarlet 回退到默认命名空间,即 _
。