0

コマンドラインから Rubyの最新の安定バージョンを照会することに興味があります。私は主に"1.9.3p327" という形式の文字列に興味があります。

更新 #1

明確にするために、目標は、1.9.3p327 または 3.0.2p392 のいずれであっても、最新の安定バージョンを一貫して照会することです。

4

4 に答える 4

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が最新であると想定しているため、再検討することをお勧めします。

于 2013-02-04T17:46:08.123 に答える
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
于 2014-03-07T01:32:24.730 に答える
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専門家ではなく、ここでより良い解決策になる可能性がありますが、この行は機能します。

于 2013-02-04T18:37:21.210 に答える
0

@maerics' と @YevgeniyAnfilofyev の回答のどちらかを選択すると、Ruby がより本物であることがわかり、 curl のリストが既に sorted であると仮定して、それをワンライナーに変えたので、条件を満たす最後の行が必要なだけです。

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 は悪いですが、1、9、3 の各数字を に置き換えると\d、正規表現は多かれ少なかれ独立したものになるようです。.../ruby/1.9もう 1 つの問題は、その ftp のフォルダーのみを調べることです。.../ruby代わりに、最初にフォルダーを調べ、バージョン番号が付けられたすべてのフォルダーを regex で見つけると、これは修正される可能性があります/\d\.\d\//。次に、上記のクエリを繰り返して、すべてのフォルダーの結果を結合します。しかし、もちろん、これはすでにワンライナーにすることはできません...

于 2013-02-04T18:57:22.233 に答える