簡體   English   中英

使用shell腳本從xml文件中提取最新版本

[英]Extract latest version from xml file using shell script

我試圖從我的存儲庫中獲取最新的工件編號,我不能使用<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

而不是最新上傳的工件,即: 3.4.6.17

shell 腳本中有沒有辦法按給定版本(版本 = 3.3.4)解析該文件?

格雷普

如果此 xml 文件總是如此扁平,您可以使用grep和 PCRE 來匹配版本節點內的文本,然后使用 GNU sort進行版本排序-V並為您的輸入模式獲取更新的版本:

grep -oP '(?<=<version>)3\.4\.4.*?(?=</version>)' file.xml | sort -V | tail -1
3.4.4.42

xmlstarlet

通常,您可以在 shell 中找到許多可以解析 xml 文件並選擇其中任何部分的工具,例如xmllintxpathxmlstarlet等。它們不僅僅解析文本,這是正確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

cat test.xml | grep -E "<version>3\.4\.4.*</version>" | sort | tail -n 1 | sed 's/<.*>\(.*\)<\/.*>/\1/g' | tr -d [:blank:]
  1. 列出xml文件的內容
  2. 搜索以3.3.4 ...開頭的版本3.3.4 ...
  3. 對結果進行排序
  4. 只保留最后一個元素(最新版本)
  5. 用 sed 刪除 xml 標簽
  6. 刪除空格字符,如制表符或空格

假設:

  • 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

刪除注釋的單行:

$ awk -F'[><]' -v bv="^${baseversion}" '$2=="version" && $3 ~ bv { latestversion=$3 } END { print latestversion }' maven*xml
3.4.4.42

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM