Ayuda. Expresiones Regulares en Perl

2006-08-08 Por tema Guillermo Escalante

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

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



Re: Ayuda. Expresiones Regulares en Perl

2006-08-08 Por tema Angel Claudio Alvarez
El mar, 08-08-2006 a las 05:50 -0400, Guillermo Escalante escribió:
 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..

 
yo cortaria el pedazo ese ( la version) y lo meteria en una variable,
siempre y cuando se encuentre entre n'-' y '/'
-- 
Angel Claudio Alvarez
Usuario Linux Registrado 143466
GPG Public Key en http://pgp.mit.edu
key fingerprint = 3AED D95B 7E2D E954 61C8  F505 1884 473C FC8C 8AC4



signature.asc
Description: Esta parte del mensaje está firmada	digitalmente