0

我对 Ruby 比较陌生,需要编写一个脚本来处理多个输入文件。它应该像这样调用:

script.rb -i file*

其中目录包含多个文件,例如file1.xmlfile2.xml。只是一个简单的问题:这个通配符将如何扩展?我需要在我的脚本中编程吗?我正在使用OptionParser该类来解析命令行参数。

谢谢!

4

4 回答 4

5

通配符由命令行扩展,因此您将获得目录中每个文件的列表

C:\working>dir *.txt

05/10/2007 03:24 PM 46,101      config.txt
11/23/2004 11:54 AM 361           tips.txt
2 File(s) 46,462 bytes

如果你这样做,

C:\working>ruby -e "puts ARGV" *.txt
config.txt
tips.txt

Ruby 将字符串 *.txt 转换为匹配的文件名,并将扩展数组作为新参数传入。

使用 optparse:

options = {}
OptionParser.new do |opts|
    opts.on("-i", Array, "List files") do |v|
      options[:files] = v
    end
  end.parse!

p options

C:\working> script.rb -i *.txt

将打印出:

["config.txt","tips.txt"]

将导致 options[:files] 是一个字符串数组

http://www.ruby-forum.com/topic/111252

于 2010-10-25T14:13:45.490 回答
2

使用-i开关而不是文件列表的奇怪想法,如果您的脚本接受文件,则可能不-i使用开关并将开关用于其他选项?如果是这样,只需使用ARGV.

于 2010-10-25T14:30:20.850 回答
1

对于 Unix,如果您想将通配符传递给 Ruby 本身,那么您需要对其进行转义(例如,通过将其放在引号内)。当命令行对所涉及的文件数量感到不满时(这可能是一个不好的迹象!),我使用了这种方法。

于 2010-10-25T22:38:36.100 回答
0
Dir["*.txt"].each do |file|
   o = open("tempfile","a")
   open(file).each do |line|
     # lines for processing
     # .....
       o.write(...)
   end
   o.close
   File.rename("tempfile",file)
end 
于 2010-10-25T14:41:13.740 回答