使用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:]
3.3.4…开头的版本。
grep
来匹配版本节点内的文本,然后使用GNUsort
执行版本排序-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