2010-10-29 9 views
18

Soy nuevo en ruby ​​y esperaba que alguien me pudiera ayudar a descubrir cómo abrir un archivo, y luego usar gsub para buscar y reemplazar por varias condiciones.Ruby - Abrir archivo, buscar y reemplazar varias líneas

Esto es lo que tengo hasta ahora, pero esto no parece funcionar como el segundo reemplazar var prevalece sobre el primero:

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} 

Respuesta

25

Cambiar la tercera línea de

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

Gracias esto funcionó. – oprogfrogo

17

Estás en sustitución del "texto" original cada vez, la segunda línea tiene que reemplazar el reemplazar:

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

Gracias Esto funcionó. – oprogfrogo

8

Un WRI interesante nkle a esto es si usted no quiere volver a analizar los datos, utiliza el formulario de bloques 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 

esto puede no ser la forma más eficiente de hacer las cosas, pero es una manera diferente de mirar el problema. Vale la pena comparar ambas formas si el rendimiento es importante para usted.

+0

Agradable, me imagino que también impide compilar el patrón dos veces. – DigitalRoss

2

que podría estar tentado a escribir así ...

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

Aquí es un chiste

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

IO.write trunca el archivo dado por defecto, por lo que si usted lee el texto primero , realice la expresión regular String.gsub y devuelva la cadena resultante usando File.open en modo bloque, reemplazará el contenido del archivo. Nifty ¿verdad?

Funciona igual de bien de varias líneas:

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