【发布时间】:2013-06-10 10:06:16
【问题描述】:
我试图弄清楚如何在 bash 控制台上编写一个衬里并通过管道连接到 ruby,但我不知道如何获取输入。这不起作用:
echo "My String" | ruby -e "#{STDIN.read.first.downcase}"
如何在 ruby 中获取管道输入?
【问题讨论】:
我试图弄清楚如何在 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
【讨论】:
# 开头(注释),它以#{...} 开头用于字符串插值。 OPs 行不输出任何内容,因为没有 print 或 puts。添加-p 标志或使用-pe 将修复它。
#{},而不是 "#{}",所以它是评论。
while gets(); ... end 围绕您的脚本循环......但打印行也像 sed。您必须更改线条才能看到差异,例如:ls -1 | ruby -pe '$_.upcase!'
只是
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") }'
等等。等等
【讨论】: