使用函数名称的哈希,搜索文件并使用行号返回

时间:2012-05-16 14:36:50

标签: ruby file-io

给定包含函数名称的散列,例如“find_by_user”,“find_by_id”,...

我想在文件目录中搜索,并返回一个包含每个文件名的对象,以及函数名称出现的行号。

到目前为止,我有这个:

files = Dir.glob(@folder_path)

files.each do |file_name|
  content = File.read(file_name)

end

这将扫描几百个文件。

1 个答案:

答案 0 :(得分:2)

以下是您需要的基本功能:

# Given a path to a file and a regex,
# return an array of paired filename+line number matches
def matching_lines( file_path, regex )
  name = File.basename(file_path)
  File.readlines(file_path)
    .map.with_index{ |line,i| [name,line,i] }
    .select{ |name,line,i| line =~ regex }
    .map{ |name,line,i| [name,i] }
end

您可以根据需要选择使用此方法,迭代多个文件和/或模式,或使用Regexp.union创建匹配任意一组字符串的模式。


但是:这是grep的用途:

C:\>grep --line-number Nokogiri *.rb
push_nav_to_docs.rb:13: nav_dom = Nokogiri.XML(IO.read(NAV))
push_nav_to_docs.rb:39:         landing = Nokogiri.XML(html)
push_nav_to_docs.rb:53: doc = Nokogiri.XML(IO.read(doc_path))
push_nav_to_docs.rb:73: if File.exists?(toc_path) && toc = Nokogiri.XML(IO.read(toc_path)).at('ul')
push_nav_to_docs.rb:104:        container << Nokogiri.make("<ul/>").tap do |ul|

在Ruby中,您可以调用此代码并通过以下方式获取所需的输出:

lookfor = "Nokogiri"
grepped = `grep --line-number #{lookfor} *.rb`
results = grepped.scan(/^(.+?):(\d+)/)
#=> [["push_nav_to_docs.rb", "13"], ["push_nav_to_docs.rb", "39"], ["push_nav_to_docs.rb", "53"], ["push_nav_to_docs.rb", "73"], ["push_nav_to_docs.rb", "104"]]

Grep也可以递归到目录中,只匹配特定的文件名,将正则表达式作为模式等等。