[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Buscar y reemplazar en varios archivos



Ipsissima verba Debian User:
> On Friday 26 March 2004 18:12, "Sergio Ruiz Pérez - aladeweb.com" wrote:
> intenta esto
> para buscar texto:
> grep -n texto_a_buscar *

Y si usas GNU grep, grep -r se mete en los directorios.  Es práctico,
para evitarte un find . -type f | xargs grep -r, o algo así.

> para modificar texto
> for i in *
> do
>         echo "Modificando texto $i"
>          cat $i | sed "s/texto_viejo/texto_nuevo/g" > $i
> done

Eso tiene un problema muy grave: el archivo que está leyendo cat es
sobreescrito por la redirección final incluso antes de arrancar el
proceso, con lo cual terminarás con una serie de archivos corruptos, o
vacíos.

Sugiero reemplazar ese pipeline por:

 cat "$i" | sed s/viejo/nuevo/g > "$i.$$" && mv "$i.$$" "$i"

O, alternativamente, botar el script sh por completo y usar sólo sed:

 sed -i s/viejo/nuevo/g *

O, si hace falta descender en directorios:

 find . -type f | xargs sed -i s/viejo/nuevo/g

(Este último encantamiento tendrá problemas si hay archivos cuyo
nombre contiene espacios, comillas u otros carácteres reservados por
el shell; en tal caso, necesitas usar la opción -exec de find, lo cual
será un poco más lento.  Ve los manuales.)

 -CR

-- 
Ceterum censeo: SCO delenda est.



Reply to: