19

我试图弄清楚如何在 bash 控制台上编写一个衬里并通过管道连接到 ruby​​,但我不知道如何获取输入。这不起作用:

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

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

4

3 回答 3

31

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
于 2013-06-13T21:03:09.307 回答
6

只是

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

或者

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

你明白了。

于 2013-06-13T21:04:54.260 回答
6

例子:

从多余的空格中删除所有行:

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

等等等等

于 2016-12-27T19:02:36.633 回答