Foros del Web » Administración de Sistemas » Unix / Linux »

Grep y replace

Estas en el tema de Grep y replace en el foro de Unix / Linux en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 21/04/2006, 02:16
Avatar de elangelcaido  
Fecha de Ingreso: septiembre-2003
Ubicación: Oviedo
Mensajes: 1.068
Antigüedad: 20 años, 7 meses
Puntos: 4
Exclamación 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.
__________________
Ta Luego! Al final sólo puede quedar uno...
________
lukos.org
  #2 (permalink)  
Antiguo 21/04/2006, 04:49
Avatar de Tk421  
Fecha de Ingreso: agosto-2001
Ubicación: Australia
Mensajes: 384
Antigüedad: 22 años, 8 meses
Puntos: 0
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)
__________________
Tk421
Configuration management for Linux
  #3 (permalink)  
Antiguo 21/04/2006, 05:40
Avatar de elangelcaido  
Fecha de Ingreso: septiembre-2003
Ubicación: Oviedo
Mensajes: 1.068
Antigüedad: 20 años, 7 meses
Puntos: 4
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.
__________________
Ta Luego! Al final sólo puede quedar uno...
________
lukos.org
  #4 (permalink)  
Antiguo 21/04/2006, 07:01
Avatar de Tk421  
Fecha de Ingreso: agosto-2001
Ubicación: Australia
Mensajes: 384
Antigüedad: 22 años, 8 meses
Puntos: 0
Código:
replace cadenaBusca cadenaNueva -- `find /ruta/a/carpeta/ | grep  -i "\.php$"`
__________________
Tk421
Configuration management for Linux
  #5 (permalink)  
Antiguo 21/04/2006, 08:26
Avatar de ociomax
Colaborador
 
Fecha de Ingreso: mayo-2002
Ubicación: Temuco, Chile
Mensajes: 5.595
Antigüedad: 22 años
Puntos: 35
¿Y por qué no usas sed? Es bastante más simple:
Código:
sed -i s/cadenaBusca/cadenaNueva/g /ruta/a/archivos/
__________________
Christian González, "OCIOMax"
http://chgonzalez.blogspot.com
http://twitter.com/chgonzalez
  #6 (permalink)  
Antiguo 21/04/2006, 11:49
Avatar de elangelcaido  
Fecha de Ingreso: septiembre-2003
Ubicación: Oviedo
Mensajes: 1.068
Antigüedad: 20 años, 7 meses
Puntos: 4
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.
__________________
Ta Luego! Al final sólo puede quedar uno...
________
lukos.org
  #7 (permalink)  
Antiguo 21/04/2006, 11:57
Avatar de ociomax
Colaborador
 
Fecha de Ingreso: mayo-2002
Ubicación: Temuco, Chile
Mensajes: 5.595
Antigüedad: 22 años
Puntos: 35
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.
__________________
Christian González, "OCIOMax"
http://chgonzalez.blogspot.com
http://twitter.com/chgonzalez
  #8 (permalink)  
Antiguo 21/04/2006, 12:23
Avatar de elangelcaido  
Fecha de Ingreso: septiembre-2003
Ubicación: Oviedo
Mensajes: 1.068
Antigüedad: 20 años, 7 meses
Puntos: 4
Muchas gracias ociomax, lo probare y te cuento.
__________________
Ta Luego! Al final sólo puede quedar uno...
________
lukos.org
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:51.