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

使用shell脚本从xml文件中提取最新版本,xml,bash,shell,maven,Xml,Bash,Shell,Maven,我正在尝试从我的存储库中获取最新的工件编号, 我无法使用3.4.6.17标记,因为我想控制获取最新版本的版本 例如,在此maven metadata.xml文件中: <?xml version="1.0" encoding="UTF-8"?> <metadata> <groupId>com.company.platform</groupId> <artifactId>platform<

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

例如,在此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>

com.company.platform
平台
3.4.6.17
3.3.0.89
3.3.17.65
3.3.17.66
3.3.19.65
3.4.2.70
3.4.2.71
3.4.4.39
3.4.4.40
3.4.4.41
3.4.4.42
3.4.6.1
3.4.6.2
3.4.6.3
3.4.6.4
3.4.6.16
3.4.6.17
20201011113748
我想获得
3.4.4
的最新版本,即:
3.4.4.42

而不是最新上传的工件:
3.4.6.17

shell脚本中有没有一种方法可以按给定的版本(版本=3.3.4)解析该文件?

cat test.xml | grep-E“3\.4\.4.*”| sort | tail-n1 | sed's/\(.\)/\1/g'| tr-d[:blank:]
  • 列出xml文件的内容
  • 搜索以
    3.3.4…开头的版本。
  • 对结果进行排序
  • 仅保留最后一个元素(最新版本)
  • 使用sed删除xml标记
  • 删除空白字符,如制表符或空格
  • 格雷普 如果此xml文件总是如此扁平,您可以使用带有PCRE的
    grep
    来匹配版本节点内的文本,然后使用GNU
    sort
    执行版本排序
    -V
    ,并获取输入模式的较新版本:

    grep-oP'(?假设:

    • OP无权访问XML解析器
    • 输入文件的格式如问题中所示
    • 版本是从最早的(文件中较早的版本)到最新的(文件中较晚的版本),所以当我们找到匹配项时,我们只需要保留最新的匹配项
    一个
    awk
    解决方案:

    $ baseversion='3.4.4'
    $ awk -F'[><]' -v bv="^${baseversion}" '             # use ">" and "<" as input field delimiters; build search pattern "^{baseversion}" and pass in as variable "bv"
    $2=="version" && $3 ~ bv { latestversion=$3 }        # if field2 equals the string "version" and field3 starts with our "^baseversion" pattern then save field3 in "latestversion"
    END                      { print latestversion }     # print the latest version
    ' maven*xml
    3.4.4.42
    
    $baseversion='3.4.4'
    
    $awk-F'[>是的,有很多方法可以做到。你尝试过什么,为什么不奏效?一般来说,在没有XML解析器的情况下解析XML是一项艰苦的工作和/或不可靠的工作,但如果格式如图所示,它是可以做到的。我对这个问题投了赞成票,原因很简单,OP没有假设这必须用
    sed
    aw来完成k
    。OP提出了正确的问题。虽然我大体上同意@JonathanLeffler的观点,但对于shell中的XML操作,我想提出一个例外,因为有更多的错误答案,然后才是正确的。这只是一个警告:在大多数情况下,最好使用Maven来解析最新版本,或者REST api或您的Nexus或工件工厂。
    $ baseversion='3.4.4'
    $ awk -F'[><]' -v bv="^${baseversion}" '             # use ">" and "<" as input field delimiters; build search pattern "^{baseversion}" and pass in as variable "bv"
    $2=="version" && $3 ~ bv { latestversion=$3 }        # if field2 equals the string "version" and field3 starts with our "^baseversion" pattern then save field3 in "latestversion"
    END                      { print latestversion }     # print the latest version
    ' maven*xml
    3.4.4.42
    
    $ awk -F'[><]' -v bv="^${baseversion}" '$2=="version" && $3 ~ bv { latestversion=$3 } END { print latestversion }' maven*xml
    3.4.4.42