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