xml - 使用 shell 脚本从 xml 文件中提取最新版本

标签 xml bash shell maven

我正在尝试从我的存储库中获取最新的 Artifact 编号, 我无法使用<release>3.4.6.17</release>标记,因为我想控制从中获取最新版本的版本。

例如在此 ma​​ven-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 文件并选择其中任何部分的工具,例如 xmllintxpathxmlstarlet 等等。他们不仅仅解析文本,这是正确且更安全的方法。这是一个例子:

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/

相关文章:

java - Android SimpleXml 中的@Namespace

html - Perl 在 HTML/XML 标签内的单词周围添加 <an></a>

linux - 将部分bash参数组合成一个字符串

bash - 用 bash 中的另一列替换 CSV 文件中的列

linux - 每 n 行拆分批量文本文件

java - 获取一个 XML 文件和一个 XSL 文件并从中生成一个 HTML 字符串?

xml - XPath:匹配多个 child 之一

linux - 带 sudo 的管道命令

linux - Shell脚本使用sendmail嵌入多个图像

perl - 如何使用shell脚本来监督一个程序?