【问题标题】:Call Ruby script on multiple input files with wildcard使用通配符在多个输入文件上调用 Ruby 脚本
【发布时间】:2011-04-30 05:49:46
【问题描述】:

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

script.rb -i file*

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

谢谢!

【问题讨论】:

    标签: ruby wildcard command-line-arguments argument-passing


    【解决方案1】:

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

    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

    【讨论】:

    • 谢谢.. 我将如何使用 OptionParser 解析参数数组(它是一个数组吗?)?
    • 非常感谢。非常感谢。
    【解决方案2】:

    使用-i 开关而不是文件列表的奇怪想法,如果您的脚本接受文件,可能在没有-i 的情况下执行它并使用开关作为其他选项?如果是这样,请使用ARGV

    【讨论】:

    • 是的,谢谢,这就是我在另一个脚本中所做的,效果也很好!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      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 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-01
        • 1970-01-01
        • 2021-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        相关资源
        最近更新 更多