我对 Ruby 比较陌生,需要编写一个脚本来处理多个输入文件。它应该像这样调用:
script.rb -i file*
其中目录包含多个文件,例如file1.xml
等file2.xml
。只是一个简单的问题:这个通配符将如何扩展?我需要在我的脚本中编程吗?我正在使用OptionParser
该类来解析命令行参数。
谢谢!
我对 Ruby 比较陌生,需要编写一个脚本来处理多个输入文件。它应该像这样调用:
script.rb -i file*
其中目录包含多个文件,例如file1.xml
等file2.xml
。只是一个简单的问题:这个通配符将如何扩展?我需要在我的脚本中编程吗?我正在使用OptionParser
该类来解析命令行参数。
谢谢!
通配符由命令行扩展,因此您将获得目录中每个文件的列表
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] 是一个字符串数组
使用-i
开关而不是文件列表的奇怪想法,如果您的脚本接受文件,则可能不-i
使用开关并将开关用于其他选项?如果是这样,只需使用ARGV
.
对于 Unix,如果您想将通配符传递给 Ruby 本身,那么您需要对其进行转义(例如,通过将其放在引号内)。当命令行对所涉及的文件数量感到不满时(这可能是一个不好的迹象!),我使用了这种方法。
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