Aplicar sed recursivo

Guillermo O. Burastero linux.gb en gmail.com
Jue Nov 3 18:08:48 CLST 2005


Juan Rojas escribió:

> Hola listeros como puedo aplicar una sustitucion con sed de manera 
> recursiva a todos sus subdirectorios
>
> ATTE JCarlos
>
>
>
Si lo que intentas es que sed modifique los archivos de un subdirectorio 
cini supongo primero create el útil comando overwite cuyo guión te 
transcribo, luego ponle permiso de ejecutable ( chmod +x overwrite) y 
muévelo a algún directorio que esté el paso de directorios de búsqueda 
de comandos ( hacer /echo $PATH/  ) de tu Linux.

#:/bin/sh
# overwrite: copia la entrada estándar en la salida luego del EOF
 
opath=$PATH
PATH=/bin:/usr/bin
 
case $# in
  0 | 1 ) echo "Uso: overwrite archivo cmd [args]" 1>&2; exit 2
esac
 
file=$1; shift

if test ! -f $file
then
  echo $file no es un archivo
  exit 1
fi
 
new=/tmp/overwr1.$$; old=/tmp/overwr2.$$
 
trap 'rm -f $new $old; exit 1' 1 2 15 # vaciar archivos
 
if PATH=$opath "$@" >$new # reunir la entrada
then
        cp $file $old   # guardar archivo original
        trap '' 1 2 15  # estamos comprometidos, ignore las señales
        cp $new $file
else
        echo "overwrite: $1 falló, $file no cambiado" 1>&2
        exit 1
fi
 
rm -f $new $old

# -------------------- fin de overwrite



luego has por ejemplo:

    for f in 'find /directorios/con/archivos/a/modificar -name "*.cpp"  
-type f '
        do overwrite $f sed "s/Licencia GPL/Licencia LGPL/" $f
    done

Nota: cambiar directorios y archivos del comando find o comando del sed 
según necesidad particular.

Como sed es un "stream editor" y supongo que querés que los cambios 
hechos queden en el mismo archivo, esta es la forma, a mi entender, más 
elegante de hacerlo echando mano al comando overwrite sacado de "El 
entorno de progrmación Unix" de "Brian W. Kernighan y Rob Pike",  pág. 
162 -ed. en español-, cap. 5 "Programación en shell". Es un lindo, breve 
y útil ejemplo de buena programación en shell que vale la pena detenerse 
a analizar.

El comando overwrite sirve en otros casos de filtros como por ejemplo si 
querés ordenar un archivo con el filtro sort
sort sirve por ejemplo para hacer: /sort file1 -o file2/  o su 
equivalente: /sort file1 > file2/, pero no pdés emplearlo en el caso de 
que file2 sea el mismo que file1 ya que se destruiría el archivo antes 
de empezar el sort.

Ahí podés emplear:   /overwrite file1 sort file1/   con el resultado 
esperado de ordenar el archivo file1. Probalo y verás.

Saludos y espero te sirva.

Guillermo.

-- 
Guillermo O. Burastero - Linux Counter User 84879, http://counter.li.org
Córdoba 171 - B8000IFC - Bahía Blanca - Buenos Aires - Rep. Argentina
Tel +54 (291) 454-6132 - ICQ 97148268 - email: linux.gb en gmail.com



Más información sobre la lista de distribución Linux