我试图弄清楚如何在Bash控制台上编写一行代码并将其管道传递到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
只需要
echo "My String" | ruby -ne 'puts $_.downcase'
或者
echo "My String" | ruby -e "puts gets.downcase"
去除所有行中的额外空格:
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") }'
等等。等等。
#
(注释)开头,而是以#{...}
表示字符串插值。OP的代码行没有输出任何内容,因为没有使用print
或puts
命令。添加-p
标志或使用-pe
命令可以解决这个问题。 - the Tin Man#{}
,而不是"#{}"
,所以它 是 一个注释。 - Stefanecho "My String" | ruby -pe "#{just a comment}"
,你也会看到My String
;) - Stefanwhile gets(); ... end
循环围绕着您的脚本...但是像sed一样也要打印行。 您必须更改这些行以查看区别,例如:ls -1 | ruby -pe '$_.upcase!'
- Stefan