我试图弄清楚如何在 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") }'
等等等等