Rubyで大きなファイルを編集する
あるフォルダ以下のファイルに関して、正規表現とか使って内容を少し変更したいことがあります。
そういうときの方法についてメモ。
Dir.glob("./path-to-folder/**/*.rb") do |file| Tempfile.open('foo') do |tf| IO.foreach(file) do |line| line = line.gsub(...) tf.write line end tf.close FileUtils.copy_file tf.path, file end end
Rubyは実に美しい。
ポイント
- Dir.globを使うと、特定のフォルダ以下のファイルを検索できる。**を使うと、サブフォルダ以下を再帰的に探していく。
- IO.foreachを使うと、行ごとに編集できるから、メモリに収まらないような巨大なファイルでも編集できる。
- とりあえず一時ファイルに保存して、その後上書きすればよい。直接ファイルを編集することはできないらしい(参考)