使用awk / sed解析/替换内联XML

时间:2017-04-21 21:22:12

标签: xml shell awk sed xmlstarlet

我正在尝试在单个shell脚本中修改pom.xml文件中的多个版本号,我不确定该组件的版本号是什么。我可以解析为版本,但是,不能替换该内联版本。

pom.xml看起来像这样:

...
        <dependency>
            <groupId>abc.efg</groupId>
            <artifactId>service1</artifactId>
            <version>0.0.10</version>
        </dependency>
        <dependency>
            <groupId>abc.efg</groupId>
            <artifactId>service2</artifactId>
            <version>0.1.5</version>
        </dependency>
        <dependency>
            <groupId>abc.efg</groupId>
            <artifactId>service3</artifactId>
            <version>0.0.1</version>
        </dependency>
...

我是shell脚本的新手,所以请原谅我,如果这有点草率,但到目前为止,我可以将服务版本拉成grep之类的;

$ grep -A 1 "service1" pom.xml | grep -Eo '[.0-9]*'
$ 0.0.10

但使用awk替换内联证明具有挑战性

$ grep -A 1 "service" pom.xml | grep -Eo '[.0-9]*' | sed 's/[,0-9]/3.2.1/g'
$ 3.2.1.3.2.1.3.2.1

输出我正在寻找的是:

0.0.10 - &gt; 3.2.1

$ grep -A 1 "service" pom.xml | grep -Eo '[.0-9]*' | #sedsyntax
$ 3.2.1

此时任何建议或指示都会受到赞赏

2 个答案:

答案 0 :(得分:1)

你可以使用sed一次完成所有操作。 搜索模式,转到下一行,替换版本号。

$ sed -r '/service1/!b;n;s/([0-9][.]?)+/1.1.11/' file
<xml>
  <dependency>
    <groupId>abc.efg</groupId>
    <artifactId>service1</artifactId>
    <version>1.1.11</version>
  </dependency>
  <dependency>
    <groupId>abc.efg</groupId>
    <artifactId>service2</artifactId>
    <version>0.1.5</version>
  </dependency>
  <dependency>
    <groupId>abc.efg</groupId>
    <artifactId>service3</artifactId>
    <version>0.0.1</version>
  </dependency>
</xml>

说明:

sed -r '/service1/!b;n;s/([0-9][.]?)+/1.1.11/' file
        |________||___||_____________________|      
            |       |               |
Pattern-----|       |               |
Go next line--------|               |
Replace Operation-------------------|
-r switch (or -E) = Extended Regexp Support

答案 1 :(得分:0)

sed表达式中的直接问题不是一次性捕获所有字符。

$ echo "0.0.10" | sed 's/[.0-9]*/3.2.1/g'
3.2.1

我强烈建议您使用xmlstarlet等XML工具执行此操作。