Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Unix / Linux (http://www.forosdelweb.com/f41/)
-   -   Grep y replace (http://www.forosdelweb.com/f41/grep-replace-387344/)

elangelcaido 21/04/2006 02:16

Grep y replace
 
Hola,

Estoy intentando hacer un script que me busque en una carpeta los archivos que contenga una cadena y me la sustituya por otra.
Yo tengo esto:
Código:

grep -r \'cadenaBusca\' /micarpeta/* | replace \'cadenaBusca\' \'nuevaCadena\'
Y en principio parece que las cambia, ya que aparece el listado de los fichero que contienen 'cadenaBusca' pero con la 'nuevaCadena'. El caso es que los cambios no permanecen.

¿Alguna idea?

Gracias por la ayuda.

Tk421 21/04/2006 04:49

Segun dice el manual de man, cito textualmente:

Cita:

replace - A utility program that is used by msql2mysql, but that has
more general applicability as well. replace changes strings in place in
files or on the standard input
. Uses a finite state machine to match
longer strings first. Can be used to swap strings.
Segun lo estas cambiando tu, logicamente te aparece la respuesta por la terminal en vez de que los cambios se hagan en los archivos.

Intenta lo siguiente (haz un backup antes, por si acaso ;)

Código:

cd micarpeta
replace cadenaBusca nuevaCadena --  *

Ojo que nunca he hexo nada de esto, lo he deducido a partir de la pagina de man

(man replace)

elangelcaido 21/04/2006 05:40

Ya, el man del REPLACE lo he mirado, pero no lo veo muy claro. He conseguido algo:
Código:

replace cadenaBusca cadenaNueva -- `find /ruta/a/carpeta/* -name "*.php"`
Pero el problema es que no hace la modificaciones recursivamente, es decir, no modifica los archivos que se encuentran en directorios inferiores a /ruta/a/carpeta/*
Y eso que find SI hace busqueda recursiva.

¿Alguna idea?

Gracias por la ayuda.

Tk421 21/04/2006 07:01

Código:

replace cadenaBusca cadenaNueva -- `find /ruta/a/carpeta/ | grep  -i "\.php$"`

ociomax 21/04/2006 08:26

¿Y por qué no usas sed? Es bastante más simple:
Código:

sed -i s/cadenaBusca/cadenaNueva/g /ruta/a/archivos/

elangelcaido 21/04/2006 11:49

Puedes explicarme algo mas sobre el comando sed. Hice man sed y la verdad no entiendo muy bien para que sirve.

Gracias por la ayuda.

ociomax 21/04/2006 11:57

En pocas palabras:

El parámetro "-i" le indica a Sed que realice los cambios en el mismmo archivo en lugar de dirigirlos a stdout.

"s/cadenaBusca/cadenaNueva/g" reemplaza ("s") cualquier ocurrencia de "cadenaBusca" por "cadenaNueva". La "g" es para que reemplace TODAS las ocurrencias; de lo contrario, sólo reemplazará la primera ocurrencia.

elangelcaido 21/04/2006 12:23

Muchas gracias ociomax, lo probare y te cuento.


La zona horaria es GMT -6. Ahora son las 07:13.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.