Поиск и замена нескольких слов в файле через Ruby - PullRequest
2 голосов
/ 02 апреля 2012

Добрый день!

Я довольно новичок в Ruby и хочу написать базовую функцию поиска и замены в Ruby. При вызове функции вы можете передавать параметры (шаблон поиска, слово замены).

Это работает следующим образом: multiedit (pattern1, замена1, pattern2, замена2, ...)

Теперь я хочу, чтобы моя функция читала текстовый файл, выполняла поиск для pattern1 и заменяла его замещением2, выполняла поиск для pattern2 и заменяла заменой2 и так далее. Наконец, измененный текст должен быть записан в другой текстовый файл.

Я пытался сделать это с помощью цикла до, но все, что я получаю, это то, что заменяется только самый первый шаблон, а все последующие шаблоны игнорируются (в этом примере только яблоко заменяется фруктом). Я думаю, проблема в том, что я всегда перечитываю оригинальный неизмененный текст? Но я не могу найти решение. Вы можете мне помочь? Для меня важно назвать функцию так, как я это делаю.

def multiedit(*_patterns)

  return puts "Number of search patterns does not match number of replacement strings!" if (_patterns.length % 2 > 0)

  f = File.open("1.txt", "r")  
  g = File.open("2.txt", "w")

  i = 0

  until i >= _patterns.length do
    f.each_line {|line|
      output = line.sub(_patterns[i], _patterns[i+1])
      g.puts output
    }
    i+=2  
  end

  f.close
  g.close

end

multiedit("apple", "fruit", "tomato", "veggie", "steak", "meat")

Вы можете мне помочь?

Большое спасибо заранее!

Привет

Ответы [ 3 ]

5 голосов
/ 02 апреля 2012

Ваш цикл был как бы наизнанку ... сделайте это вместо этого ...

  f.each_line do |line| 
    _patterns.each_slice 2 do |a, b|
      line.sub! a, b
    end
    g.puts line
  end
3 голосов
/ 02 апреля 2012

Пожалуй, наиболее эффективный способ оценки всех шаблонов для каждой строки - это создание одного регулярного выражения из всех шаблонов поиска и использование формы замены хеша String # gsub

def multiedit *patterns
  raise ArgumentError, "Number of search patterns does not match number of replacement strings!" if (_patterns.length % 2 != 0)

  replacements = Hash[ *patterns ].
  regexp = Regexp.new replacements.keys.map {|k| Regexp.quote(k) }.join('|')

  File.open("2.txt", "w") do |out|
    IO.foreach("1.txt") do |line|
      out.puts line.gsub regexp, replacements
    end
  end
end
0 голосов
/ 10 мая 2015

Проще и лучше использовать erb.

http://apidock.com/ruby/ERB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...