我正在尝试从我的存储库中获取最新的 Artifact 编号,
我无法使用<release>3.4.6.17</release>
标记,因为我想控制从中获取最新版本的版本。
例如在此 maven-metadata.xml 文件中:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>com.company.platform</groupId>
<artifactId>platform</artifactId>
<versioning>
<release>3.4.6.17</release>
<versions>
<version>3.3.0.89</version>
<version>3.3.17.65</version>
<version>3.3.17.66</version>
<version>3.3.19.65</version>
<version>3.4.2.70</version>
<version>3.4.2.71</version>
<version>3.4.4.39</version>
<version>3.4.4.40</version>
<version>3.4.4.41</version>
<version>3.4.4.42</version>
<version>3.4.6.1</version>
<version>3.4.6.2</version>
<version>3.4.6.3</version>
<version>3.4.6.4</version>
<version>3.4.6.16</version>
<version>3.4.6.17</version>
</versions>
<lastUpdated>20201011113748</lastUpdated>
</versioning>
</metadata>
我想获取最新的3.4.4
版本,即:3.4.4.42
.
并且不是最新上传的 Artifact :3.4.6.17
.
shell 脚本中有没有办法按给定版本 (version=3.3.4) 解析该文件?
最佳答案
grep
如果这个 xml 文件总是那么扁平,您可以使用 grep
和 PCRE 来匹配版本节点内的文本,然后使用 GNU 进行版本排序 -V
排序
并获取输入模式的较新版本:
grep -oP '(?<=<version>)3\.4\.4.*?(?=</version>)' file.xml | sort -V | tail -1
3.4.4.42
xmlstarlet
通常,您可以在 shell 中找到许多可以解析 xml 文件并选择其中任何部分的工具,例如 xmllint
、xpath
、xmlstarlet
等等。他们不仅仅解析文本,这是正确且更安全的方法。这是一个例子:
xmlstarlet sel -t -m '//version[starts-with(., "3.4.4")]' -v . -n file.xml
3.4.4.39
3.4.4.40
3.4.4.41
3.4.4.42
您可以再次将上面的内容通过管道传递给sort -V
。
关于xml - 使用 shell 脚本从 xml 文件中提取最新版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64304453/