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

pix*_*rth 15 ruby bash stdin pipe

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

echo "My String" | ruby -e "#{STDIN.read.first.downcase}"
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*fan 23

Ruby将您的行视为注释,因为它以a开头#.

这可行:

echo "My String" | ruby -e "puts gets.downcase"
Run Code Online (Sandbox Code Playgroud)

输出:

my string
Run Code Online (Sandbox Code Playgroud)

我用过Kernel#gets而不是STDIN.gets:

返回(并分配给$ _)ARGV(或$*)中文件列表中的下一行,如果命令行中没有文件,则返回标准输入

如果要处理每一行,可以使用该-p标志.这就像在一个while gets(); ... end; puts $_ 块中包装你的脚本.Ruby读取每个输入行$_,然后评估您的脚本和输出$_:

echo "Foo\nBar\nBaz" | ruby -pe '$_.downcase!'
Run Code Online (Sandbox Code Playgroud)

输出:

foo
bar
baz
Run Code Online (Sandbox Code Playgroud)


Dor*_*ian 6

例子:

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

ls | ruby -e "STDIN.each_line.to_a.map(&:strip).each(&method(:puts))"
Run Code Online (Sandbox Code Playgroud)

随机着色每一行:

ls | ruby -e "require 'colorize'; STDIN.each_line { |l| print l.colorize(String.colors.sample) }"
Run Code Online (Sandbox Code Playgroud)

按长度对行进行排序:

ls | ruby -e "puts STDIN.each_line.to_a.sort_by(&:size).reverse"
Run Code Online (Sandbox Code Playgroud)

按文件大小对文件进行排序:

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") }'
Run Code Online (Sandbox Code Playgroud)

等等等等


Jer*_*ert 5

只是

echo "My String" | ruby -ne 'puts $_.downcase'
Run Code Online (Sandbox Code Playgroud)

要么

echo "My String" | ruby -e "puts gets.downcase"
Run Code Online (Sandbox Code Playgroud)

你明白了.