2010-10-29 12 views
18

Je suis nouveau à ruby ​​et j'espérais que quelqu'un pourrait m'aider à comprendre comment ouvrir un fichier, puis utiliser gsub pour trouver et remplacer par plusieurs conditions.Ruby - Ouvrir un fichier, trouver et remplacer plusieurs lignes

semblent Voici ce que je suis arrivé à ce jour, mais cela ne veut pas travailler le 2 remplacer var remplace la première:

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} 

Répondre

25

Modifier la troisième ligne à

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

Merci cela a fonctionné. – oprogfrogo

17

Vous remplacez du « texte » d'origine à chaque fois, la deuxième ligne doit remplacer le remplacer:

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

Merci cela a fonctionné. – oprogfrogo

8

Un WRI intéressant nkle à cette question est si vous ne voulez pas réanalyser les données, utilisez le formulaire de bloc de gsub:

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

Cela peut ne pas être le moyen le plus efficace de faire les choses, mais il est une autre façon de regarder le problème. Il vaut la peine de comparer les deux façons si la performance vous importe.

+0

Nice, j'imagine que cela empêche également de compiler le motif deux fois. – DigitalRoss

2

je pourrais être tenté de l'écrire comme ça ...

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

Voici une doublure

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

IO.write tronque le fichier donné par défaut, si vous lisez le texte premier , exécutez la regex String.gsub et renvoyez la chaîne résultante en utilisant File.open en mode bloc, elle remplacera le contenu du fichier. Nifty pas vrai?

Il fonctionne aussi bien sur plusieurs lignes:

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