[caracas-pm] Ayuda con Expresiones Regulares

Guillermo Escalante metallinux at gmail.com
Wed Aug 9 08:14:43 PDT 2006


Gracias a Todos, esta fue la solucion que implemente, a demás era algo
sencillo y no me quise complicar mucho, quizas no sea la mas elegente
pero me resulto:


Muchas Gracias Francisco.

Como veo me estaba ahogando yo solo en un vaso de agua la cosa estaba
super sencilla (yo más o menos tenia ya la idea pero es que la
documentación esta un poco engorrosa). Pero bueno es que soy nuevo con
Perl y no tengo mucha experiencia en lo de las Expresiones Regulares..


La cosa quedo así:

 /opt/perl/bin/perl -p -i.bak -e
's!Systems/.*-([^/]*)/.*/UsmPrint.ps!Systems/$1/script/UsmPrint.ps!
usm*/conf/param.cfg

y funcionó como queria nuevamente gracias

2006/8/9, Andrés Gazsó <agazso at ius.cc>:
> Estimado Guillermo:
>
> ¿Te resolvió la ayuda que te escribieron? Si no está claro te lo podemos
> explicar en la reunión de los Mongers o en su defecto, mándame el
> problema exacto con un archivo de texto en dos columnas con data de
> prueba, donde en una columna estaría la data original y en la otra la
> data como la deseas y te construyo la expresión regular.
>
> A todo evento te recalco lo que ya te dijo SquOnk, lo encerrado entre
> paréntesis de un lado de la sustitución, se copia al otro lado con las
> variables implícitas $1,$2,$3... etc. las cuales "graban" los datos de
> un lado de la sustitución y las "copian" al otro lado. Ejemplo:
>
> Si ejecutas
>
> s/(La reunión de los Mongers es el sábado) 26/$1 12/;
>
> Te arroja "La reunión de los Mongers es el sábado 12"
>
> Otro ejemplo, cambiando la fecha del estilo US al estilo ISO:
>
> s|(mes)/(día)/(año)|$3-$1-$2|;
>
> lo cual convierte una fecha digamos 08/27/2006 (agosto 27, 2006) a
> 2006-08-27. observa que en la función de sustitución, utilicé "|° como
> delimitador en vez de "/". Realmente hubiera podido utiliziar cualquier
> caracter no reservado o ambiguo, siempre y cuando se utilice en forma
> consistente.
>
> A todo evento te sugiero que leas el manual de Perl  ~$ man perlrequick
> y ~$ man perlretut toda vez que como siempre digo... "Es increíble lo
> que uno aprende leyendo el f... manual"
>
> Saludos,
>
> Vader.
>
>
> On Tue, 2006-08-08 at 08:42 -0400, Guillermo Escalante wrote:
> > Saludos
> > Les escribo a ver quien me puede echar una manito. Muchas gracias de antemano
> >
> > El cuento es el siguiente: estoy construyendo varias expresiones
> > regulares en Perl ya que necesito  modificar en varios archivos de
> > configuración  (archivos de texto plano) una cadena de texto, por
> > otra. El caso es que la cadena nueva (la que va a reemplazar) depende
> > de la cadena vieja (cadena a ser reemplazada). Específicamente es un
> > path hacia un archivo pero los nombres de los directorios contienen
> > las versiones de los programas, y el reemplazo debe hacerse utilizando
> > estas versiones.
> >
> > Esta primera es un ejemplo que ya resolvi (es para que vean más o
> > menos como es la cosa)
> >
> > los path's a reemplazar son más o menos asi
> >
> > "Systems/1353NM-XXX/data/eml/usmvW.Y.Z/UsmPrint.ps"
> >
> > donde XXX, es la versión (puede varia la cantidad de caracteres) y
> > varia en el path de casi todos los archivos ejemplo (3.4, 4.5d, 7.9a,
> > 4.5.6a 6.7.0)
> >
> > W.Y.Z tambien pueden variar por algunos números o letras pero no son
> > importantes en este caso
> >
> > y la cadena que reemplaza seria la siguiente.
> >
> > "Systems/1353NM-XXX/script/UsmPrint.ps"
> >
> > donde XXX es la versión de la cadena que reemplazara (osea la de la
> > cadena anterior)
> >
> > Asi me quedo la expresión regular para el caso anterior
> >
> > /opr/perl/bin/perl -p -i.bak -e
> > 's!Systems/([^/])*/.*/UsmPrint.ps!Systems/$1/script/UsmPrint.ps!'
> > usm*/conf/param.cfg
> >
> > usm*/conf/param.cfg son todos los archivos a modificar
> >
> > --------------------------------------------------------------------------------------------------------------------------------
> > Ahora el cambio que necesito hacer (en donde tengo la duda) seria el
> > siguiente: La cadena original seria igual
> >
> > "Systems/1353NM-XXX/data/eml/usmvW.Y.Z/UsmPrint.ps"
> >
> > donde XXX, es la versión (puede varia la cantidad de caracteres) y
> > varia en casi todos loa archivos ejemplo (3.4, 4.5d, 7.9a, 4.5.6a
> > 6.7.0)
> >
> > W.Y.Z tambien pueden variar por algunos números o letras pero no son
> > importantes en este caso
> >
> > y la cadena que reemplaza ahora seria la siguiente.
> >
> > "Systems/XXX/script/UsmPrint.ps"
> >
> > Pero como ven en este caso solo necesito capturar la versión y pasarla
> > como parámetro
> >
> > se que la E.R. regular queda más o menos asi pero no se que iria
> > dentro del parentesis (para que sea pasado como variable a la cadena
> > que reemplazará)
> >
> > /opr/perl/bin/perl -p -i.bak -e 's!Systems/(no se que va
> > aqui)*/.*/UsmPrint.ps!Systems/$1/script/UsmPrint.ps!'
> > usm*/conf/param.cfg
> >
> > He leido muchisimos manuales y guias, de perl y de expresiones
> > regulares pero no he encontrado nada similar, he encontrado otras
> > cosas que me han ayudado con otras sustituciones parecidas, pero no he
> > encontrado la form correcta para capturar solo la versión. No se si en
> > este caso seria capturar lo que este entre el "-" y el  "/" que en
> > este caso seria la versión.
> >
> > Una ves más cualquier ayuda de antemano será bien recibida..
> >
> >
>
> _______________________________________________
> caracas-pm mailing list
> caracas-pm at pm.org
> http://mail.pm.org/mailman/listinfo/caracas-pm
>


-- 
---------------------------------------------------------------
|  Ing. Guillermo Escalante                        |
|  Nick IRC: MetallinuX                              |
|  GNU/Linux User #379221                       |
|  Debian GNU/Linux "Testing/Unstable"     |
|  "Cuando hablamos de Software Libre,     |
|  nos referimos a la libertad, no al precio"  |
---------------------------------------------------------------


More information about the caracas-pm mailing list