Buscar y reemplazar desde Ruby

Dado que la línea de comando es un chorizo de caracteres que no siempre es fácil recordar, pensé en hacer un script en ruby que hiciera lo mismo pero con una sintaxis de tipo:

srchreplace cadena_a_buscar cadena_nueva *.php

Básicamente lo que quería hacer era, por ejemplo, encontrar todos los archivos de php que hacen  referencia a “contabilidad.php” y cambiarlos por “contabilidad.py” .

Lo primero, para no reinventar la rueda fue buscar un script similar. Lo más parecido que encontré fue en la página “Erik on Rails“. Si bien no era exactamente lo mismo, tenía una clase que se podía aprovechar. Gracias Erik.

Lo segundo fue crear el script que haga uso de esa clase.

Acá va el script:

#!/usr/bin/env ruby
class File
def replace(pattern, string)
full_path = File.expand_path path
return if !File.file?(full_path)

reopen(full_path, 'r')
lines = readlines

changes = false
lines.each do |line|
changes = true if line.gsub!(pattern, string)
end

if changes
reopen(full_path, 'w')
lines.each do |line|
write(line)
end
close
end
end
end

if ARGV.count != 3
puts "Error: argumentos incorrectos"
puts "Uso: srchrep.rb cadena_buscar cadena_reemplazar archivos"
puts "Donde 'archivos' es una lista de archivos en formato *.* entre comillas "
else
# ver si existe archivo
# hacer una lista de archivos que tengan la cadena buscada
files = Dir.glob(ARGV[2])
numarch = files.count
# por cada archivo de la lista
for filename in files
arch = File.open(filename)
arch.replace(/#{ARGV[0]}/,ARGV[1])
end
end

El principal problema es que el shell convierte la línea de comandos expandiendo los comodines, por lo cual la sintaxis pasa a ser:

./srchreplace.rb cadena_buscar cadena_reemplazar "*.php"

No encontré manera más elegante de hacerlo. Pero me resulta práctico.

Un comentario en “Buscar y reemplazar desde Ruby

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s