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

piz*_*lms 2 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>
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 行应该是什么?

谢谢你。

rev*_*evo 5

您可以使用使用否定字符类的限制性正则表达式:

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是对第一个捕获组的反向引用。