0

「find_by_user」、「find_by_id」などの関数名を含むハッシュを指定すると、...

ファイルのディレクトリを検索し、各ファイル名を持つオブジェクトと、関数名が発生した行番号を返したいと考えています。

私はこれまでのところこれを持っています:

files = Dir.glob(@folder_path)

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

end

これにより、数百のファイルがスキャンされます。

4

1 に答える 1

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 は、ディレクトリを再帰的に検索したり、特定のファイル名のみを照合したり、パターンとして正規表現を使用したりすることもできます。

于 2012-05-16T15:03:31.797 に答える