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