我想替换我的 xml 文件的 pkg-ref 行中的版本号,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<pkg-ref id="com.mycomp.pkg.foo1" version="1.1.15" auth="Root" installKBytes="">#foo1.pkg</pkg-ref>
<pkg-ref id="com.mycomp.pkg.foo2" version="1.1.15" auth="Root" installKBytes="">#foo2.pkg</pkg-ref>
Run Code Online (Sandbox Code Playgroud)
我试过这个:
#!/bin/sh
NEW_VERSION="1.2.0"
sed -ie "s/version=\"*.*.*\"/version=\"$NEW_VERSION\"/" foo.xml
Run Code Online (Sandbox Code Playgroud)
...但它删除了该行的其余部分,并替换了只有 2 位数字且我不想要的 xml 版本...留给我的是:
<?xml version="1.2.0"?>
<pkg-ref id="com.mycomp.pkg.foo1" version="1.2.0">#foo1.pkg</pkg-ref>
<pkg-ref id="com.mycomp.pkg.foo2" version="1.2.0">#foo2.pkg</pkg-ref>
Run Code Online (Sandbox Code Playgroud)
我的 sed 行应该是什么?
谢谢你。
您可以使用使用否定字符类的限制性正则表达式:
sed -ie "s/\(<pkg-ref [^>]*version=\"\)[^\"]*\"/\1$NEW_VERSION\"/" foo.xml
Run Code Online (Sandbox Code Playgroud)
分解:
\( 开始捕获组 #1
<pkg-ref?<pkg-ref?字面匹配,?表示空格字符[^>]* 直到第一次关闭 >version=\"version="逐字匹配(此处可能有回溯)\) CG #1 结束[^\"]*\" 匹配并包括第一个双引号替换字符串\1是对第一个捕获组的反向引用。