Ответ 1
Измените третью строку на
replace = replace.gsub(/bbb/, "Replace bbb with 222")
Я новичок в 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}
Измените третью строку на
replace = replace.gsub(/bbb/, "Replace bbb with 222")
Каждый раз вы заменяете исходный текст, вторая строка должна заменить замену:
replace = replace.gsub(/bbb/, "Replace bbb with 222")
Интересная морщина для этого - если вы не хотите повторно пролистывать данные, используйте блочную форму gsub:
replace = text.gsub(/(aaa|bbb)/) do |match|
case match
when 'aaa': 'Replaced aaa with 111'
when 'bbb': 'Replace bbb with 222'
end
end
Это может быть не самый эффективный способ сделать что-то, но это другой способ взглянуть на проблему. Стоит сравнивать оба способа, если вам важна производительность.
У меня может возникнуть соблазн написать его вот так...
#!/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
Вот один лайнер
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
)