fxn@feynman:~/tmp$ cat foo.txt
foo
bar
baz
fxn@feynman:~/tmp$ ruby -pi -we ‘gsub!(/baz/, “woo”)’ foo.txt
fxn@feynman:~/tmp$ cat foo.txt
foo
bar
woo
En codigo se puede tambien hacer eso via la variable global $-i:
extension para fichero de backup, cadena vacia si ninguno
$-i = ‘’
ARGV.replace([‘foo.txt’])
ARGF.each_line do |line|
print line.gsub(/woo/, “baz”)
end
En Perl la solucion canonica a esto en codigo es usar el modulo
estandard Tie::File, que permite manipular un archivo de texto como
si se tratara de un array de lineas, pero he buscado un poco y no
parece que este portado a Ruby.
No manipulas el archivo directamente pero puedes modificar las lineas
que
quieras cómodamente y luego hacer un write.
Un saludo,
Juanjo
----- Original Message -----
On Feb 5, 2007, at 11:50 AM, Luis V. wrote:
db_config.write("password: root")
end
end
En linea de comandos puedes usar -pi:
fxn@feynman:~/tmp$ cat foo.txt
foo
bar
baz
fxn@feynman:~/tmp$ ruby -pi -we ‘gsub!(/baz/, “woo”)’ foo.txt
fxn@feynman:~/tmp$ cat foo.txt
foo
bar
woo
En codigo se puede tambien hacer eso via la variable global $-i:
extension para fichero de backup, cadena vacia si ninguno
$-i = ‘’
ARGV.replace([‘foo.txt’])
ARGF.each_line do |line|
print line.gsub(/woo/, “baz”)
end
En Perl la solucion canonica a esto en codigo es usar el modulo
estandard Tie::File, que permite manipular un archivo de texto como
si se tratara de un array de lineas, pero he buscado un poco y no
parece que este portado a Ruby.
Gracias por las respuestas, pero no he conseguido que vaya…
En el ejemplo que me ha dicho sebastián he hecho
así:
File.open(“fichero.txt”,“r+”) do |output|
File.read(“fichero.txt”).each { | line | output << (line =~ /una
cosa/) ? “la otra” : line }
end
Y me recarga el archivo, pero no modifica nada.
para el de Juanjo, he hecho algo
así:
f = File.new(“fichero.txt”,“r+”)
lineas=f.readlines
for l in lineas
puts l
if (l =~ /una cosa/)
f.write(“la otra”)
end
end
Y me añade el texto al final del archivo.
Los otros dos ejemplos no me valen por como está planteada la
aplicación.
Bueno, haciendo mil pruebas, me ha quedado
así:
File.open(“archivo.txt”,“r+”) do |output|
File.read(“archivo.txt”).each { | line |
if line=~/una cosa/
output << " otra cosa\n"
else
output << line
end
}
end
Cuando se abre un archivo el objeto (descriptor de archivo C por
debajo) tiene asociado un modo, un offset de lectura/escritura, hay
buffers por enmedio, etc. propios. Al abrir el archivo por dos veces
esos atributos, que son por descriptor, pueden pisarse unos a otros.
Por ejemplo mira esta sesion:
fxn@feynman:~/tmp$ cat archivo.txt && echo
1
a
fxn@feynman:~/tmp$ cat foo.rb
File.open(“archivo.txt”,“r+”) do |output|
File.read(“archivo.txt”).each do |line|
if line =~ /1/
output << 2
else
output << line
end
end
end
fxn@feynman:~/tmp$ ruby foo.rb
fxn@feynman:~/tmp$ cat archivo.txt && echo
2aa
Ves que hay una “a” repetida?
Al trabajar con ficheros las reglas son simples, uno tiene un puntero
siempre donde las opraciones de escritura y lectura se realizan. Por
debajo este puntero se gestiona automaticamente con lecturas y
escrituras, y uno puede manualmente moverlo con seek. Si vas con seek
a un cierto byte de por la mitad ya es responsabilidad tuya el pisar
o no los datos que habia ahi. No hay una manera builtin en C de
borrar o insertar bytes en un offset arbitrario.