什么是ruby -a命令行开关?

时间:2017-02-22 17:27:08

标签: ruby string command-line

来自man页面:

 -a     Turns on auto-split mode when used with -n or -p.
        In auto-split mode, Ruby executes
              $F = $_.split
        at beginning of each loop.

有些问题浮现在脑海中:

  • 在没有-a-n的情况下使用-p时会发生什么?
  • 什么是$F
  • 循环结束时会发生什么?
  • 如何控制选择哪个字符到split
  • 如何使用-a

来自另一个reference page

$F      The variable that receives the output from split when -a is specified.
        This variable is set if the -a command-line option is specified
        along with the -p or -n option.

我还不确定-a切换是什么。希望得到解释,但会更多地欣赏一些例子。

我尝试过的一些事情:

$ echo foo_bar_bar | ruby -ae
ruby: no code specified for -e (RuntimeError)
$ echo foo_bar_bar | ruby -ap
$ echo foo_bar_bar | ruby -ap '$_'
ruby: No such file or directory -- $_ (LoadError)

1 个答案:

答案 0 :(得分:4)

使用-a开关启用自动分割模式。它支持awk默认执行的文本处理 在自动分割模式下,ruby将读取作为参数或stdin给出的文件 一次一行,每行一行:

  1. 根据字段分隔符(由$_标志指定)自动将行-F拆分为字段
  2. 将结果分配给名为$F
  3. 的变量
  4. 通过命令行执行操作。
  5. 处理完所有行后,程序退出或执行END block。请参阅此答案,了解example

    自动拆分模式对于处理包含许多recordsrecords行除非record separator已更改)的表格文本文件以及多个分隔的{{1}非常有用在每一行。 例如,考虑一个内容为fields的内容:

    file

    然后ADG:YUF:TGH UIY:POG:YTH GHJUR:HJKL:GHKIO 打印每行的第三个字段:

    ruby -F: -a -n -e 'puts $F[2]' file

    在这种情况下,$ ruby -F: -a -n -e 'puts $F[2]' file TGH YTH GHKIO 会将字段分隔符设置为-F::是分割后记录($F)后字段的数组。分割后为每一行执行$_后的操作。

    -e cli开关与ruby非常相似。 perl cli使此功能更加便捷,请参阅perldoc perlrun。例如,由于perl在没有-a(或-n)的情况下无效,因此在-p中,perl会隐式启用-F,而-a依次启用-n启用rubyruby不是这种情况,必须明确传递所有开关。 有关使用此类处理可以完成的好事的示例,请查找awk one liners

    此外,-a cli遵循传递command-line options的unix约定:

      

    传统上,UNIX命令行选项由短划线组成,后跟一个或多个小写字母。

    因此-n-e switches以及$ ruby -F: -ane 'puts $F[2]' file TGH YTH GHKIO flag可以合并,以达到相同的效果:

    {{1}}

    如果这很有趣,请查看其他一些ruby one liners.