我想替换我的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>
我试过了:
#!/bin/sh
NEW_VERSION="1.2.0"
sed -ie "s/version=\"*.*.*\"/version=\"$NEW_VERSION\"/" foo.xml
...但是它删除了部分剩下的部分,并且还替换了只有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>
我的sed行应该是什么?
谢谢。
答案 0 :(得分:1)
您可以使用使用否定字符类的限制性正则表达式:
sed -ie "s/\(<pkg-ref [^>]*version=\"\)[^\"]*\"/\1$NEW_VERSION\"/" foo.xml
故障:
\(
开始捕获组#1
<pkg-ref□
从字面上匹配<pkg-ref□
,□
表示空格字符[^>]*
首次关闭>
version=\"
按字面意思匹配version="
(此处可能回溯)\)
CG#1结束[^\"]*\"
匹配并包括第一个双引号替换字符串\1
是对第一个捕获组的反向引用。
答案 1 :(得分:0)
你可以这样做:
sed -i "s/version=\"[^\"]*\"/version=\"${NEW_VERSION}\"/g" foo.xml