19

bash コンソールに 1 つのライナーを記述して Ruby にパイプする方法を見つけようとしていますが、入力を取得する方法がわかりません。これは機能していません:

echo "My String" | ruby -e "#{STDIN.read.first.downcase}"

Rubyでパイプ入力を取得するにはどうすればよいですか?

4

3 に答える 3

31

で始まるため、Ruby はこの行をコメントとして扱います#

これはうまくいきます:

echo "My String" | ruby -e "puts gets.downcase"

出力:

my string

私はKernel#gets代わりに使用しましたSTDIN.gets

コマンド ラインにファイルが存在しない場合は、ARGV (または $*) のファイルのリストから、または標準入力から次の行を返します (そして $_ に割り当てます)。

各行を処理したい場合は、-pフラグを使用できます。while gets(); ... end; puts $_ スクリプトをブロックでラップするようなものです。Ruby は各入力行を に読み込み$_、スクリプトを評価してから出力$_します。

echo "Foo\nBar\nBaz" | ruby -pe '$_.downcase!'

出力:

foo
bar
baz
于 2013-06-13T21:03:09.307 に答える
6

例:

余分なスペースからすべての行を削除します。

ls | ruby -e "STDIN.each_line.to_a.map(&:strip).each(&method(:puts))"

各行をランダムに色付けします。

ls | ruby -e "require 'colorize'; STDIN.each_line { |l| print l.colorize(String.colors.sample) }"

行を長さで並べ替える:

ls | ruby -e "puts STDIN.each_line.to_a.sort_by(&:size).reverse"

ファイル サイズでファイルを並べ替える:

ls -l | ruby -e 'STDIN.first; puts STDIN.each_line.to_a.map { |l| [l.split[4].to_i, l.split[8]] }.sort_by(&:first).reverse.map { |l| l.join("\t") }'

などなど

于 2016-12-27T19:02:36.633 に答える