我正在试图弄清楚如何在bash控制台上编写一个内衬并管道到ruby,但我无法弄清楚如何获取输入。这不起作用:
echo "My String" | ruby -e "#{STDIN.read.first.downcase}"
如何在ruby中获取管道输入?
答案 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
等。等