来自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)
答案 0 :(得分:4)
使用-a
开关启用自动分割模式。它支持awk
默认执行的文本处理
在自动分割模式下,ruby将读取作为参数或stdin
给出的文件
一次一行,每行一行:
$_
标志指定)自动将行-F
拆分为字段$F
处理完所有行后,程序退出或执行END
block。请参阅此答案,了解example。
自动拆分模式对于处理包含许多records
(records
行除非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
启用ruby
。 ruby
不是这种情况,必须明确传递所有开关。
有关使用此类处理可以完成的好事的示例,请查找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.