bash コンソールに 1 つのライナーを記述して Ruby にパイプする方法を見つけようとしていますが、入力を取得する方法がわかりません。これは機能していません:
echo "My String" | ruby -e "#{STDIN.read.first.downcase}"
Rubyでパイプ入力を取得するにはどうすればよいですか?
で始まるため、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
余分なスペースからすべての行を削除します。
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") }'
などなど