使用 awk/sed 到 parse/replace XML 内联

Using awk/sed to parse/replace XML inline

我试图在单个 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 -> 3.2.1

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

此时如有任何建议或指点,我们将不胜感激

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

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

我强烈建议使用像 xmlstarlet 这样的 XML 工具来执行此操作。

您可以使用 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