【问题标题】:How to get piped input to ruby -e on command line?如何在命令行上通过管道输入 ruby​​ -e?
【发布时间】:2013-06-10 10:06:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby bash pipe stdin


    【解决方案1】:

    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
    

    【讨论】:

    • OP 的行不以# 开头(注释),它以#{...} 开头用于字符串插值。 OPs 行不输出任何内容,因为没有 printputs。添加-p 标志或使用-pe 将修复它。
    • Ruby 计算 #{},而不是 "#{}",所以它评论。
    • 然后在我的回答中解释我的第一个示例中的输出。
    • 它读取输入行并在之后打印它们:假设 while gets(); ... end 围绕您的脚本循环......但打印行也像 sed。您必须更改线条才能看到差异,例如:ls -1 | ruby -pe '$_.upcase!'
    • 啊,好点子。我站得更正了。当我与偏头痛作斗争时,我可以正确回答。叹。 :-/ 我认为您已经解决了 OP 问题中的问题。干得好。
    【解决方案2】:

    只是

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

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

    你明白了。

    【讨论】:

      【解决方案3】:

      示例:

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

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

      等等。等等

      【讨论】:

        猜你喜欢
        • 2013-01-22
        • 1970-01-01
        • 2013-06-17
        • 1970-01-01
        • 2018-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多