[caracas-pm] Ayuda con Expresiones Regulares

Andrés Gazsó agazso at ius.cc
Wed Aug 9 07:44:45 PDT 2006


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..
> 
> 



More information about the caracas-pm mailing list