我有兴趣从命令行查询Ruby的最新稳定版的。我主要对“1.9.3p327”格式的字符串感兴趣。如何从命令行获取最新的稳定Ruby版本?
更新#1
为了澄清,我们的目标是一致查询最新的稳定版本,不管是1.9.3p327或3.0.2p392。
我有兴趣从命令行查询Ruby的最新稳定版的。我主要对“1.9.3p327”格式的字符串感兴趣。如何从命令行获取最新的稳定Ruby版本?
更新#1
为了澄清,我们的目标是一致查询最新的稳定版本,不管是1.9.3p327或3.0.2p392。
开始使用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
喜欢的东西:
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是最新的,所以你可能想重新考虑一下。
“它假定Ruby 1.9.3是最新的” - 不幸的是,这样做的目的是失败的。 – user456584
@ user456584我认为可以通过对这个脚本进行一些修改来解决问题,让主要想法保持不变。我在一个** UPD **中描述了我的想法,[我的变体](mastics的答案)(http://stackoverflow.com/a/14693560/693538)。 – NIA
你可以玩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
专家,这里可能是更好的解决方案,但此行的作品。
@maerics'之间和@ YevgeniyAnfilofyev的答案选择,我发现了Ruby一个更正宗,把它变成一个内胆,假定从卷曲列表已经排序,所以我们只需要简单的最后行会议的条件:
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]"
或者,红宝石部分展开:
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]
Followi在这个脚本中添加排序功能留给读者练习:)
UPD:当然,硬编码1.9.3是坏的,但如果我们替换每个数字1,9和3与\d
,正则表达式似乎变得或多或少独立。另一个问题是我们只查看该ftp的.../ruby/1.9
文件夹。如果我们先查看.../ruby
文件夹,并使用正则表达式/\d\.\d\//
查找所有版本号的文件夹,则这可能会得到解决。然后重复上述查询,加入所有文件夹的结果。但是,当然,这已经不能做成单线...
你是什么意思你对这个字符串感兴趣? – sawa
查看更新以获得澄清。 – user456584