如何替换文件中的版本号?

时间:2018-04-15 22:44:35

标签: regex unix sed

我想替换我的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行应该是什么?

谢谢。

2 个答案:

答案 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