如何在命令行上获取ruby -e的管道输入?

时间:2013-06-13 20:56:37

标签: ruby bash pipe stdin

我正在试图弄清楚如何在bash控制台上编写一个内衬并管道到ruby,但我无法弄清楚如何获取输入。这不起作用:

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

如何在ruby中获取管道输入?

3 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:5)

只需

echo "My String" | ruby -ne 'puts $_.downcase'

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

你明白了。

答案 2 :(得分:2)

示例:

从额外空格中删除所有行:

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") }'

按文件大小排序文件:

Int

等。等