【问题标题】:How to replace version number in file?如何替换文件中的版本号?
【发布时间】:2018-04-15 22:44:35
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: regex unix sed


    【解决方案1】:

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

    sed -ie "s/\(<pkg-ref [^>]*version=\"\)[^\"]*\"/\1$NEW_VERSION\"/" foo.xml
    

    细分:

    • \( 捕获组 #1 的开始
      • &lt;pkg-ref□ 匹配 &lt;pkg-ref□ 字面意思, 表示空格字符
      • [^&gt;]* 直到第一次关闭&gt;
      • version=\" 匹配 version=" 字面意思(此处可能回溯)
    • \) CG #1 结束
    • [^\"]*\" 匹配到并包含第一个双引号

    在替换字符串中\1 是对第一个捕获组的反向引用。

    【讨论】:

    • 哇。这完美无缺。如果我说我明白了,那我就是在撒谎。谢谢。
    【解决方案2】:

    你可以这样做:

    sed -i "s/version=\"[^\"]*\"/version=\"${NEW_VERSION}\"/g" foo.xml
    

    【讨论】:

    • 那么你肯定有 BSD sed。所以尝试sed -i '' 而不是sed -i。或者使用sed -ie 创建一个以e 作为扩展名的备份
    • 我使用了 sed -ie,它几乎可以工作了......问题是它还替换了我想要保持不变的 xml 版本行。
    猜你喜欢
    • 2020-08-01
    • 2021-03-23
    • 2022-12-17
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多