如何在Ruby中将文本文件作为参数传递

时间:2018-04-16 02:16:45

标签: ruby file text

我需要传递一个文本文件作为参数,而不是在代码中打开它。文本文件的内容应该在控制台上打印。我已经完成了以下代码:

REINSTALLMODE="amus"

请建议。

2 个答案:

答案 0 :(得分:2)

在shell上,调用ruby脚本,后跟.txt文件的名称,如下所示:

ruby foo.rb test_list.txt

变量ARGV将包含对调用ruby解释器时传递的所有参数的引用。特别是ARGV[0] = "test_list.txt",因此您可以使用此代替硬编码文件的名称:

File.open(ARGV[0]).each do |line|
    puts line
end



另一方面,如果您想将文件的内容传递给您的程序,可以使用:

cat test_list.txt | ruby foo.rb

并在程序中:

STDIN.each_line do |line|
    puts line
end

答案 1 :(得分:0)

Ruby有Perl / awk / sed根。与Perl和awk一样,如果在命令行中使用相同的代码提供stdin或打开文件名,则可以使用'magic'。

假设:

$ cat file
line 1
line 2
line 3

您可以编写一个cat之类的实用程序来打开命名文件:

$ ruby -lne 'puts $_' file
line 1
line 2
line 3

或者,相同的代码,将逐行读取stdin:

$ cat file | ruby -lne 'puts $_'
line 1
line 2
line 3

在这种特殊情况下,它来自Ruby的-lne命令行参数。

 -n             Causes Ruby to assume the following loop around your
                script, which makes it iterate over file name arguments
                somewhat like sed -n or awk.

                      while gets
                        ...
                      end

 -l             (The lowercase letter ``ell''.)  Enables automatic line-
                ending processing, which means to firstly set $\ to the
                value of $/, and secondly chops every line read using
                chop!.

 -e command     Specifies script from command-line while telling Ruby not
                to search the rest of the arguments for a script file
                name.

不使用-n开关,您还可以使用ARGF流并修改代码,以便它以相同的方式使用stdin或命名文件。

命名文件:

$ ruby -e '$<.each_line do |line|
    puts line
end' file
line 1
line 2
line 3

使用相同的代码阅读stdin

$ cat file | ruby -e '$<.each_line do |line|
    puts line
end' 
line 1
line 2
line 3