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)
从多余的空格中去除所有行:
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)
等等等等
只是
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)
你明白了.