2010-10-29 2 views
18

Ich bin neu in Ruby und hoffte, dass jemand mir helfen könnte, herauszufinden, wie man eine Datei öffnet, und dann gsub verwendet, um mehrere Bedingungen zu finden und zu ersetzen.Ruby - Datei öffnen, mehrere Zeilen finden und ersetzen

Hier ist, was ich so weit gekommen, aber dies scheint nicht als 2. arbeiten var ersetzen überschreibt die erste:

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} 

Antwort

25

ändern die dritte Zeile zu

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

Danke, das hat funktioniert. – oprogfrogo

17

Sie aus dem ursprünglichen „Text“ jedes Mal, die zweite Zeile zu ersetzen muss ersetzen die ersetzen:

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

Dank dieser gearbeitet. – oprogfrogo

8

Eine interessante wri nkle dazu ist, wenn Sie nicht die Daten erneut zu scannen wollen, verwenden Sie die Blockform gsub:

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

Dies ist nicht der effizienteste Weg sein kann, Dinge zu tun, aber es ist eine andere Art und Weise auf das schauen Problem. Benchmarking in beide Richtungen, wenn Leistung für Sie wichtig ist.

+0

Schön, ich stelle mir vor, dass auch verhindert, das Muster zweimal zu kompilieren. – DigitalRoss

2

ich versucht sein, könnte es so zu schreiben ...

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

Hier ist ein Einzeiler

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

IO.write die angegebene Datei standardmäßig abschneidet, wenn Sie also zuerst den Text lesen Führen Sie die Regex String.gsub aus und geben Sie die resultierende Zeichenfolge unter Verwendung von File.open im Blockmodus zurück. Dadurch wird der Inhalt der Datei ersetzt. Geschickt, oder?

Es funktioniert genauso gut mehrzeiligen:

IO.write(filepath, File.open(filepath) do |f| 
    f.read.gsub(/aaa|bbb/) do |m| 
     (m.eql? 'aaa') '111' : '222' 
    end 
    end 
) 
Verwandte Themen