Любые советы по использованию gsub? Отлично работает в консоли irb, но не выполняет поиск/замену в реальных файлах.

У меня есть базовая структура для веб-приложения (несколько статических страниц, аутентификация пользователя, базовое тестирование с помощью rpec). Я хотел бы использовать это как основу для будущих веб-приложений. Я назвал свой проект «фреймворк», поэтому, если я его разветвлю, у меня будет около дюжины случаев, когда мне придется заменить термин «фреймворк» на имя нового приложения, которое я создаю. Этот проект называется github.com/bnd5k/framework. Файл README содержит список файлов, в которых мне нужно внести изменения. Я могу внести эти изменения вручную, но я бы предпочел автоматизировать этот процесс. Я полагаю, что проще всего было бы включить файл rake в Framework. Итак, я создал файл rake с именем renamer.rake. Мой файл rake основан на этом сообщении: Как найти в тексте файла шаблон и заменить его заданным значением. Вот что я придумал.

task :rename do

  file_names = ['config/environments/test.rb', 'config/environments/production.rb', 
    'config/environment.rb']
  file_names.each do |file_name|
    text = File.read(file_name)
    puts text.gsub("Framework", "funktrunkgunk")
  end
end

Этот код работает, поскольку он заменяет термин «фреймворк» другим термином, но это работает только в консоли. Мне нужно, чтобы на самом деле изменить содержимое файлов. Что мне нужно сделать? Нужно ли открывать каждый файл, а не просто читать его?

К вашему сведению, в этом коде перечислены только несколько файлов (только чтобы я мог проверить, работает ли этот метод), и термин замены в конечном итоге будет переменной, а не «funktrunkgunk». Как только я закончу эту часть, я хотел бы настроить ее так, чтобы любой мог клонировать репозиторий фреймворка на свой компьютер, перейти в каталог фреймворка, запустить сервер rails, а затем перейти на локальный хост в своем браузере, чтобы переименовать файл из там. Я настрою public/index.html как базовую страницу, содержащую поле формы, где пользователь может ввести свое собственное имя для приложения. Как только пользователь нажмет кнопку «Имя приложения», он запустит файл rake. Это звучит осуществимо?


person Ben Downey    schedule 12.03.2012    source источник
comment
Не используйте read, если вы не уверены, что файл поместится в памяти. Построчный ввод-вывод быстрее для больших файлов и масштабируем. stackoverflow.com/a/25189286/128421   -  person the Tin Man    schedule 26.11.2014


Ответы (2)


Вам нужно снова записать измененный текст в файл.

File.open(file_name, 'w') { |f| f << text.gsub("Framework", "funktrunkgunk") }
person Christopher Creutzig    schedule 12.03.2012
comment
Интересно, не могли бы вы объяснить, что делает с файлом оператор побитового сдвига влево? - person Andomar; 12.03.2012
comment
Из документов 1.9. ios << obj : Строковый вывод — записывает obj в ios. obj будет преобразован в строку с помощью to_s. - person AShelly; 12.03.2012
comment
@AShelly: спасибо, поиск документов 1.9 указал мне на нужное место - person Andomar; 12.03.2012

Все, что делает ваш код, — это подставляет локальную переменную text. Чтобы внести изменения в физический файл, вы должны открыть файл и написать замененный текст. например

task :rename do

  file_names = ['config/environments/test.rb', 'config/environments/production.rb', 
    'config/environment.rb']
  file_names.each do |file_name|
    text = File.read(file_name)
    File.open(file_name, "w") { |file| file << text.gsub("Framework", "funktrunkgunk") }
  end
end
person TCopple    schedule 12.03.2012
comment
Не используйте read, если вы не уверены, что файл поместится в памяти. Если он больше, чем доступная память, программа перейдет к обходу. Вместо этого используйте построчный ввод-вывод для масштабируемости и скорости. stackoverflow.com/a/25189286/128421 - person the Tin Man; 26.11.2014