Pages

martes, diciembre 09, 2014

FIND + SED, reemplazo masivo de texto dentro de archivos

Mi ejemplo: Necesito encontrar el texto:
{-$FOLDER-}

y reemplazarlo por el texto :
{-$SWFOLDERROOT-}/

en todos los archivos de extensión .tpl

que se encuentren a partir del directorio en el que estoy posicionado en todas las carpetas contenidas. El comando es el siguiente:
find -type f -name "*.tpl" -exec sed -i 's~{-$FOLDER-}~{-$SWFOLDERROOT-}/~g' '{}' \;

Las aclaraciones del caso:

find -type f -name "*.tpl"  buscar los archivos cuyo nombre sea o contenga *.tpl

- exec por cada resultado anterior ejecutar el comando que sigue.

sed -i (stream editor, editor de flujo seria la traduccion literal, la opción -i (in place) indica que la edición se realice sobre el mismo archivo. Es decir lo reemplaza. si quisieran backupear el original podrían hacer -i.tmp o la versión larga --in-place=.tmp

's~{-$FOLDER-}~{-$SWFOLDERROOT-}/~g'

la expresión va encerrada entre comillas simples.
s (comando sustituir), ~ es un tipo de separador, sed acepta ~ ó / ó | como separadores válidos. a continuación del separador va la expresión a buscar. En este caso {-$FOLDER-}, luego otro separador ~ luego la expresion de reemplazo. En este caso {-$SWFOLDERROOT-}/, luego otro separador ~ y finalmente el comando g (global), que indica que reemplace todas las ocurrencias.

{} El par de corchetes vacios es reemplazado por el nombre de archivo que va a pasar find como parametro de la funcion -exec. El uso correcto de la función debería encerrar las llaves entre comillas simples para evitar que el shell lo interprete como otra cosa.

\; todo lo que sigue a continuacion del primer comando del exec se considera argumentos del comando a excepcion de '{}', hasta que se encuentre un ; para mayor seguridad de que el shell no lo interprete como otra cosa se lo escapa con \, aunque tambien podría encerrarse entre comillas.

Los sitios de los que saqué información:
http://www.brunolinux.com/02-The_Terminal/Find_and%20Replace_with_Sed.html 
http://www.grymoire.com/Unix/Sed.html#uh-62h 
http://www.comoinstalarlinux.com/comandos-linux-find-con-ejemplos-3/

2 comentarios:

  1. Para escapar una comilla simple en los textos a reemplazar y de reemplazo, usar '\''

    find -type f -name "*.php" -exec sed -i 's~'\''una/ruta'\''~$GLOBALS['\''app_data'\''].'\''/rutanueva'\''~g' '{}' \;

    ResponderBorrar