shell 从远程元数据xml文件获取最高版本

insrf1ej  于 2023-10-23  发布在  Shell
关注(0)|答案(3)|浏览(125)

我在artifactory metadata.xml中有一个包含以下信息的远程文件

<version>3.1.2.0</version>
      <version>3.1.2.506</version> 
      <version>3.1.2.507</version> 
      <version>3.1.2.508</version>

如果我分支名称是release/3.1.2,通过解析上述xml文件,shell命令需要返回3.1.2.508,这是最新版本。
任何人都可以帮助。这是在gitlab ci cd管道中,试图基于最新版本提升版本。我没有使用<latest></latest>的选项
谢谢你,谢谢

pdsfdshx

pdsfdshx1#

如果xmllint可用(在大多数Linux发行版中,它都是libxml工具),则此命令将从提供的示例中获取最新版本

xmllint --xpath '//version[last()]/text()' tmp.xml 
3.1.2.508

如果版本不符合顺序

xmllint --xpath '//version/text()' tmp.xml | sort --version-sort | tail -n1

包含xmllint的软件包(在我的本地发行版上,即)

rpm -qf /usr/bin/xmllint 
libxml2-tools-2.9.14-150400.5.22.1.x86_64

使用gawk单行程序的替代方案

gawk 'BEGIN{RS="\\s*<[/]?version>"}{ if(NR>1 && $0 ~ /([0-9]+\.){3,3}/){ver[NR-1]=$0 }} END{n=asort(ver); print ver[n]}' tmp.xml

给定

<?xml version="1.0" encoding="utf-8"?>
<Parent>
  <Field1 type="int">7933</Field1>
  <Field2>9.26</Field2>
  <Field3>xxx</Field3>
  <Field4>yyy</Field4>
  
           <version>3.1.2.507</version><version>3.1.2.0</version>
      <version>3.1.2.506</version> 

      <version>3.1.2.508</version>

  <version>3.1.1.508</version>
</Parent>

结果

3.1.2.508
dsekswqp

dsekswqp2#

可以使用xq utility查询xml文件

filename="metadata.xml"
xpath_query="version"
latest="$(xq -x "${xpath_query}" $filename | sort -rn | head -n 1)"
echo $latest
3.1.2.508

xq -x "${xpath_query}" $filename将从文件中提取所查询的XML元素的文本。这被输送到sort -rn中,使用自然(-n)排序以反向(-r)顺序对这些进行排序,然后我们通过输送到head -n 1来获取排序输出的第一行。
如果你对文件的内容和版本字符串的格式比较有信心,你可能只需要使用grep表达式,而不需要真正解析XML:

latest="$(grep -oP '\d+\.\d+\.\d+\.\d+' < metadata.xml | sort -rn | head -n 1)"
echo $latest
3.1.2.508
pu82cl6c

pu82cl6c3#

使用sed命令

sed -n '/<version>/{s/.*<version>//;s/<\/version.*//;p;}' metadata.xml | sort -V | tail -1

相关问题