Buscar y reemplazar texto en muchos archivos

Hay muchas formas de hacerlo y seguramente muchos IDEs ya lo hacen. Creo que Textmate, Notepad++ y Textedit son los únicos editores de código ligeros que lo hacen. Terrible que uno sea solo para OS X y los otros dos para Windows. La gente asume que todos los linuxeros usamos la consola y las expresiones regulares para todo.

Bueno, quizás lo primero si. Pero usar expresiones regulares siempre ha sido un dolor de cabeza para mi (no se como pasé Compiladores I). En busca de una solución express, tiré código a lo idiota y he aquí la idiotez llamada replace.php que me ha sacado de apuro:

<?php
	$data = file_get_contents($_SERVER['argv'][1]);
 
	$find =		'<td class="pie"><a href="#">Políticas de privacidad</a> <a href="#">Vigencia del catalogo</a> <a href="#">Mapa del sitio</a></td>';
	$replace =	'<td class="pie"><a href="/pagina/politicas-privacidad">Políticas de privacidad</a> <a href="/pagina/terminos-condiciones">Terminos y condiciones</a></td>';
 
	$new_data = str_replace($find,$replace,$data);
 
	if($data != $new_data)
	{
		echo $_SERVER['argv'][1]." <-- Modificado\n";
		file_put_contents($_SERVER['argv'][1],$new_data);
	}
?>

Se ejecuta desde consola para más practicidad, si, lo he dicho :D

find ./ -name *.ctp -exec php replace.php {} \;

El comando find buscará en el directorio ./ todos los archivos que terminen con la extensión .ctp y ejecutará mi script mandandole como argumento la ruta del archivo encontrado. El proceso es recursivo, por lo que si encuentra un archivo en varios subdirectorios la ejecución manualmente se traduciría en algo como php replace.php ./views/pages/politicas.ctp

La ventaja de usarlo en consola es que podemos personalizar la elección de los archivos a modificar con una sencilla expresión regular, que se podría hacer más poderosa para un filtro más avanzado de archivos, pero igual yo he sido feliz concatenando la instrucción dos veces en una misma linea, así:

$ find ./ -name *.ctp -exec php replace.php {} \; && find ./ -name *.html -exec php replace.php {} \;
./views/layouts/default.ctp <-- Modificado
./webroot/formulario.html <-- Modificado
./webroot/viajes.html <-- Modificado
./webroot/hacemos.html <-- Modificado
./webroot/contacto.html <-- Modificado
./webroot/static.catalogo.html <-- Modificado
./webroot/estamos.html <-- Modificado
./webroot/quienes.html <-- Modificado
./webroot/nuevos.html <-- Modificado
./webroot/beneficios.html <-- Modificado
./webroot/gracias.html <-- Modificado
./webroot/principal.html <-- Modificado
./webroot/unete.html <-- Modificado
./webroot/negocio.html <-- Modificado
$

Algo bruto, pero funciona incluso con mucho texto por buscar y mucho por reemplazar. La he usado tanto que decidí dedicarle este pequeño apunte, quizás a alguien más le puede servir.

Escribe un comentario

*
*