Como cortar esta variable

203 views
Skip to first unread message

Gonzalo Marcote

unread,
Jul 3, 2008, 7:19:51 AM7/3/08
to asterisk-es
Hola.
Supongamos que tengo la variable: a/b/c
Y quiero obtener: abc
sin las barras /
¿Sabéis como cortar esta variable de una vez?

Si hago esto me quedo con la 'a' :

exten => 1,1,Set(PRUEBA=A/B/C)
exten => 1,n,Set(NEWPRUEBA=${CUT(PRUEBA|/|1})

Pero no atino a como puedo hacer esto que quiero.

¿Alguien me puede echar una mano?

Gracias

bauer

unread,
Jul 3, 2008, 7:56:33 AM7/3/08
to asterisk-es

Con CUT puedes hacer que te devuelva varios campos, pero te los
devuelve con el delimitador (por lo que no te serviría):

Por ejemplo:

exten => 1,1,Set(PRUEBA=A/B/C)
exten => 1,n,Set(NEWPRUEBA=${CUT(PRUEBA|/|1-2)}) => Te devuelve A/B

Una solución si lo quieres hacer en una linea podría ser:

exten => 1,1,Set(PRUEBA=A/B/C)
exten => 1,n,Set(NEWPRUEBA=${CUT(PRUEBA|/|1)}${CUT(PRUEBA|/|2)}$
{CUT(PRUEBA|/|3)})

Un saludo

Alberto

Gonzalo Marcote

unread,
Jul 3, 2008, 8:10:04 AM7/3/08
to asterisk-es
Me vale perfectamente. Yo lo había puesto línea por línea igualándola
a variables y luego en otra línea concatenar esas variables (a veces
me obceco). Pero mejor así como haces cortando y concatenando las
variables todo en una misma línea.
Gracias.

Saúl Ibarra

unread,
Jul 4, 2008, 3:26:50 AM7/4/08
to aster...@googlegroups.com
Si quieres hacerlo sin hadcodear el número de campos puedes utilizar
FIELDQTY y hacer un while ;)

[Syntax]
FIELDQTY(<varname>|<delim>)

[Synopsis]
Count the fields, with an arbitrary delimiter

--
Saúl -- "Nunca subestimes el ancho de banda de un camión lleno de disketes."
----------------------------------------------------------------
http://www.saghul.net/

David Temes

unread,
Jul 4, 2008, 1:46:14 PM7/4/08
to aster...@googlegroups.com
Este post me ha inspirado y animado para echar un vistazo al tutorial de creación de módulos para asterisk que corre por ahí, y estoy trabajando en la aplicación app_regex, esta es la información sobre su funcionamiento:

asterisk1*CLI> core show application regex
asterisk1*CLI>
  -= Info about application 'Regex' =-

[Synopsis]
Regex dialplan application

[Description]
Usage: Regex(varname,rex,input)
  Applies the regular expression rex to input
  and stores the result in varname

Está al 90% y estoy pensando la mejor forma de pasar las coincidencias encontradas al dialplan. De momento la ultima coincidencia la asigna a la variable cuyo nombre se indica en la llamada, un ejemplo de uso desde el dialplan sería:

exten =>1001,1,noop(regex test)
exten =>1001,n,Regex(test,H(ol)a/,Hola)
exten =>1001,n,noop(${test})
exten =>1001,n,hangup

Que asignaría "ol" a la variable test.

En el caso que inicio este post para cortar la cadena tal y como comentaba Gonzalo la cosa podría ser tal que así:

exten =>1001,n,Regex(test,(.*)/(.*)/(.*),a/b/c)

Y en lugar de devolver el ultimo "match" podría devolver la concatenación de todas las coincidencias.

No se si la aplicación en si tiene sentido, algunas veces he tenido que llamar a un agi para hacer cosas de este tipo y app_regex podría ser una buena solución. En cualquier caso es un buen ejercicio.

Si alguien tiene alguna sugerencia será bienvenida.

Saludos












2008/7/4 Saúl Ibarra <sag...@gmail.com>:

Saúl Ibarra

unread,
Jul 4, 2008, 1:55:16 PM7/4/08
to aster...@googlegroups.com
Enhorabuena por el tema!! Muy buena idea!! Lo mejor sería que pusieras
un ticket en bugs.digium.com indicando [newapp] y ahí te comentarán
como modificarla o lo que sea para que sea inlcuida en el trunk...

David Temes

unread,
Jul 7, 2008, 3:33:07 AM7/7/08
to aster...@googlegroups.com
Gracias Saul por la info, finalmente creo que no desarrollaré la aplicación. Revisando código para ilustrarme he visto que hay una func_regex que hace algo parecido, pero simplemente devuelve un boleano indicando si hay o no hay coincidencia con la expresión regular facilitada.

Creo que lo suyo será parchear el código para que además de comprobar si hay concordancia devuelva algun resultado, he pensado que podría establecer las siguientes variables:

nummatch numero de coincidencias
match1: coincidencia 1
match2: coincidencia 2
....
matchN: coincidencia n
matchall: concatenación de todas las coincidencias.

Además he visto que la funcion existente hace uso de una librería diferente, yo había instalado pcre y modificado el makefile para incluir la librería.

Saludos
Reply all
Reply to author
Forward
0 new messages