从BASH中的换行符分隔列表中获取最新版本

时间:2014-11-17 21:24:01

标签: bash

我正在运行一个小的curl命令来从网页中检索以下信息。 我想从这个输出中收到任何损坏文件的“最新版本” 问题是。要记住的是有RC数字,这也是 在循环内部(下面的代码),并且输出可能并不总是有序。

输入

facter-1.7.5-rc1.dmg
facter-1.7.5-rc2.dmg
facter-1.7.5.dmg
facter-1.7.6.dmg
facter-2.0.1-rc1.dmg
facter-2.0.1-rc2.dmg
facter-2.0.1-rc3.dmg
facter-2.0.1-rc4.dmg
facter-2.0.1.dmg
facter-2.0.2.dmg
facter-2.1.0.dmg
facter-2.2.0.dmg
facter-2.3.0.dmg

预期输出

facter-2.3.0.dmg

当前正在处理它的循环

function get_latest()
{
  local url="$1"
  local name="$2"

  for pkg in $(wget -q "${url}" -O - |grep -o ">${name}.*dmg" |cut -c 2-); do 
    echo "${url}/${pkg}"; 
  done
}

FACTER_URL="$(get_latest 'http://downloads.puppetlabs.com/mac/' 'facter')"
echo $FACTER_URL ##http://downloads.puppetlabs.com/mac/facter-2.3.0.dmg

2 个答案:

答案 0 :(得分:2)

您可以在此处使用sort -V

sort -rV file | head -1
facter-2.3.0.dmg

根据man sort

  -V, --version-sort
          natural sort of (version) numbers within text

PS:这也会照顾rc个版本。

答案 1 :(得分:0)

另一种方法(我使用适当的XML / HTML解析器):

get_latest() {
  local url="$1"
  local name="$2"

  printf '%s\n' $(xmllint --html --xpath "//a/@href[contains(., '$2')]" $url) |
      sort -V |
      awk -F'"' 'END{print url$2}' url=$url
}

get_latest 'http://downloads.puppetlabs.com/mac/' 'facter'

输出:

http://downloads.puppetlabs.com/mac/facter-2.3.0.dmg

注意:

xmllint附带libxml2-utils debian和衍生物