Railsで「この変数はどこで定義されているんだ?」と困ったときに、ディレクトリ以下のファイルすべてでパターンマッチをしたいです。なので、Grepコマンドもどきを作ってみました。
require 'find'
def grep(pattern, directory)
Find.find(directory) do |path|
if FileTest.file?(path)
file = open(path)
while line = file.gets
puts "#{path}: #{file.lineno}" if line =~ pattern
end
file.close
end
end
end
grep(Regexp.new(ARGV[0]), ARGV[1])
実行結果
C:\codes\ruby>ruby grep.rb @task c:\codes\rails\rails_apps\task
c:\codes\rails\rails_apps\task/app/views/admin/tasks/show.html.erb: 3
c:\codes\rails\rails_apps\task/app/views/admin/tasks/show.html.erb: 8
c:\codes\rails\rails_apps\task/app/views/admin/tasks/show.html.erb: 13
c:\codes\rails\rails_apps\task/app/views/admin/tasks/show.html.erb: 17
c:\codes\rails\rails_apps\task/app/views/admin/tasks/new.html.erb: 5
c:\codes\rails\rails_apps\task/app/views/admin/tasks/index.html.erb: 8
c:\codes\rails\rails_apps\task/app/views/admin/tasks/edit.html.erb: 5
c:\codes\rails\rails_apps\task/app/views/admin/tasks/edit.html.erb: 26
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 16
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 20
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 27
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 31
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 37
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 43
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 46
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 48
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 49
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 52
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 60
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 63
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 65
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 69
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 77
c:\codes\rails\rails_apps\task/app/controllers/admin/tasks_controller.rb: 78
ご覧の通り、修正しなきゃいけないのは出力するパス名が絶対パスになっているというところです。引数に渡したパスに対して相対パスにしたい。
でも、なんかうまくいかないんですよね。例えば
path = path.sub(Regexp.new(directory), '')
を加えてもダメでした。うまくいくと思ったんですが。
なぜダメなのか、そして何かいいアイディアがありましたら、お願いします。