如何在多个文件中找到子字符串?

时间:2018-07-12 13:53:45

标签: ruby file

我需要使用Ruby来遍历目录并在特定类型的文件中查找文本。

例如,我的文件夹包含以下文件: a.txt,b.txt,c.trr,d.trr 我希望我的代码仅检查 c.trr d.trr 文件,并查找其中之一是否包含字符串“ aaa”。

我尝试了一些选择,但似乎没有一个适合我。

我尝试过:

Dir.foreach("/myusername/Desktop/a") do |fname|
    if  (File.extname(fname) == ".trr")
       begin
        fname.each_line do |line|
       if 
        line.scan(Regexp.new('aaa'))
        puts "found it!"
       else
        puts "no can do sir"
        end
        end
        rescue Exception => ex
                puts ex
        end
    end
end

没用。 当我尝试打印line变量时,得到的是文件名而不是其中的行。

我试图将scan函数更改为match,并且我也试图 将Regexp.new('aaa')更改为\aaa\

它们似乎都不起作用。 Dir.foreach是否还会打开文件?如果不是,如何打开它? 我尝试使用File.open(fname),但遇到以下异常:

  

没有这样的文件或目录@ rb_sysopen

2 个答案:

答案 0 :(得分:1)

通常,Dir方法将仅返回文件名。您仍然需要手动打开和读取文件。

Dir["*.trr"].each do |fname|
  content = File.read(fname)
  if content =~ /aaa/
    puts "found it in: #{fname}"
  else
    puts "not found in: #{fname}"
  end
end

您可以使用Dir#[]并传递匹配的字符串,而不是使用foreach。然后,只需将文件内容与所需内容进行比较即可。

答案 1 :(得分:0)

上面的答案很好,但是您可以通过创建包含正则表达式但不匹配正则表达式的数组来进一步使用Ruby的Enumerable处理:

with_aaa, without_aaa = Dir["*.trr"].partition do |filename|
  File.read(filename) =~ /aaa/
end

...或者,如果您不在乎与正则表达式匹配的 ,则可以使用select代替partition

with_aaa = Dir["*.trr"].select do |filename|
  File.read(filename) =~ /aaa/
end