Ruby - открыть файл, найти и заменить несколько строк - PullRequest
20 голосов
/ 29 октября 2010

Я новичок в ruby ​​и надеялся, что кто-нибудь поможет мне разобраться, как открыть файл, а затем с помощью gsub найти и заменить несколькими условиями.

Вот то, что я получил до сих пор, но, похоже, это не работает, так как 2-я замена заменяет первую:

text = File.read(filepath)
replace = text.gsub(/aaa/, "Replaced aaa with 111")
replace = text.gsub(/bbb/, "Replace bbb with 222")
File.open(filepath, "w") {|file| file.puts replace}

Ответы [ 5 ]

27 голосов
/ 29 октября 2010

Измените третью строку на

replace = replace.gsub(/bbb/, "Replace bbb with 222")
16 голосов
/ 29 октября 2010

Вы заменяете исходный «текст» каждый раз, вторая строка должна заменить замену:

replace = replace.gsub(/bbb/, "Replace bbb with 222")
9 голосов
/ 29 октября 2010

Интересная проблема: если вы не хотите повторно сканировать данные, используйте блочную форму gsub:

replace = text.gsub(/(aaa|bbb)/) do |match|
  case match
    when 'aaa': 'Replaced aaa with 111'
    when 'bbb': 'Replace bbb with 222'
  end
end

Возможно, это не самый эффективный способ сделать что-то, но это другой способ взглянуть на проблему. Стоит сравнить оба способа, если производительность важна для вас.

3 голосов
/ 20 сентября 2013

Вот один лайнер

IO.write(filepath, File.open(filepath) {|f| f.read.gsub(/aaa|bbb/) {|m| (m.eql? 'aaa') '111' : '222'}})

IO.write обрезает данный файл по умолчанию, поэтому, если вы сначала прочитаете текст, выполните регулярное выражение String.gsub и вернете полученную строку, используя File.open в режиме блокировки, он заменит содержимое файла. Отличная правда?

Работает так же хорошо, многострочный:

IO.write(filepath, File.open(filepath) do |f|
    f.read.gsub(/aaa|bbb/) do |m|
      (m.eql? 'aaa') '111' : '222'
    end
  end
)
2 голосов
/ 29 октября 2010

У меня может возникнуть желание написать это так ...

#!/usr/bin/env ruby

filepath = '/tmp/test.txt'

File.open filepath, 'w' do |f|
  $<.each_line do |line|
    f.puts line.gsub(/aaa/,
      'Replaced aaa with 111').gsub /bbb/, 'Replace bbb with 222'
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...