我有兴趣从命令行查询Ruby的最新稳定版本。我主要对形式为“1.9.3p327”的字符串感兴趣。
更新#1
澄清一下,目标是始终查询最新稳定版,无论是1.9.3p327还是3.0.2p392。
答案 0 :(得分:1)
类似的东西:
curl 'http://ftp.ruby-lang.org/pub/ruby/1.9/' | ruby ./extract-and-print-max-patchlevel.rb
extract-and-print-max-patchlevel.rb
脚本的实现是读者的练习,但这是一个开始:
#!/usr/bin/env ruby
maxpatch=0
maxstr=nil
STDIN.each_line do |line|
next unless line =~ /1\.9\.3-p(\d+)\b/
patch = $1.to_i
if patch > maxpatch
maxpatch = patch
maxstr = $&
end
end
puts maxstr
请注意,它假定Ruby 1.9.3是最新版本,因此您可能需要重新访问它。
答案 1 :(得分:1)
开始使用rbenv后回到此处。如果你安装了rbenv,下面的单线程就可以解决问题:
#!/usr/bin/env ruby
puts `~/.rbenv/bin/rbenv install --list`.split("\n").map{|item| item.strip}.select{|item| item[/^\d*\.\d*\.\d*/]}.reject{|item| (item.include? '-') && !(item =~ /-p\d*$/)}.last
答案 2 :(得分:0)
您可以使用sed
或awk
进行游戏。例如:
curl "http://ftp.ruby-lang.org/pub/ruby/1.9/" | sed -E 's/^.*"(ruby-)(1.9.3-p[0-9]+)(.*)".*$/\2/' | sed -e '/^1.*/!d' | sort | sed '$!d'
我不是sed
专家,这可能是更好的解决方案,但这条线路可行。
答案 3 :(得分:0)
选择@maerics'和@ YevgeniyAnfilofyev的答案,我发现Ruby更多正宗并将其变成单行,假设curl的列表已经排序,所以我们只需要满足条件的最后行:
curl 'http://ftp.ruby-lang.org/pub/ruby/1.9/' 2> /dev/null | ruby -e "puts STDIN.lines.map { |x| /1\.9\.3-p\d+\b/.match(x) }.compact.last[0]"
或者,Ruby部分扩展了:
puts STDIN.lines.map do |x|
/1\.9\.3-p\d+\b/.match(x) # After such map we will get an array of MatchData or nils
end.compact.last[0] # Then we remove nils using Array#compact,
# get last MatchData and retrieve matched string with [0]
遵循良好的传统,在此脚本中添加排序作为读者的练习:)
UPD:当然,硬编码的1.9.3很糟糕,但如果我们用\d
替换每个数字1,9和3,正则表达式似乎或多或少独立。另一个问题是我们只查看该ftp的.../ruby/1.9
文件夹。如果我们首先查看.../ruby
文件夹,并使用正则表达式/\d\.\d\//
查找所有版本编号的文件夹,则可以修复此问题。然后重复上述查询,加入所有文件夹的结果。但是,当然,这已经不能成为单线......