2012-04-01 77 views
2

大家下午好!搜索和通過紅寶石替換文件的多個單詞

我非常新的Ruby和想編寫一個基本的搜索和Ruby的替換功能。 當你調用該函數,你可以傳遞參數(搜索模式,替換單詞)。

這是這樣的:multiedit(模式1,replacement1,模式2,replacement2,...)

現在,我想我的函數讀取一個文本文件中,搜索模式1和與replacement2取代它,搜索pattern2並將其替換爲replacement2等等。最後,修改後的文本應該寫入另一個文本文件。

我試圖用這樣做,直到循環,但我得到的是,雖然所有的下列模式被忽視只有第一個模式被替換(在這個例子中,只有蘋果被替換爲水果)。我認爲問題在於我總是重讀原始未改變的文本?但我找不出解決方案。你可以幫我嗎?以我所做的方式調用函數對我來說很重要。

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") 

你能幫我嗎?

非常感謝您提前!

問候

回答

5

你的循環是一種由內而外......做到這一點,而不是...

f.each_line do |line| 
    _patterns.each_slice 2 do |a, b| 
     line.sub! a, b 
    end 
    g.puts line 
    end 
+0

這就是我一直在尋找的。必須添加require'enumerator',因爲我正在運行一個較老的ruby版本,但現在它完全按照它應該做的。 非常感謝您的快速反應! – 2012-04-02 07:51:30

3

也許是最有效的方法來評估每行所有的模式是建立一個從所有的搜索模式單一的regexp並使用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

也很有趣的方法來解決我的問題。 gsub確實非常有用。將來會更頻繁地使用它。 感謝您的建議! – 2012-04-02 07:52:52