Подтвердить что ты не робот

Ruby - открыть файл, найти и заменить несколько строк

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

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

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}
4b9b3361

Ответ 1

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

replace = replace.gsub(/bbb/, "Replace bbb with 222")

Ответ 2

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

replace = replace.gsub(/bbb/, "Replace bbb with 222")

Ответ 3

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

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

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

Ответ 4

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

#!/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

Ответ 5

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

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
)