|
||
|
|
|
|||||||
| Tasker Para hablar de todo lo relacionado con la aplicación tasker |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Me he encontrado en un foro (no digo cuál par no dar pistas) una cuestión aparentemente sencilla que está dando mucho juego.
La pregunta del millón es esta... ¿Cómo capitalizar la primera letra de cada palabra en una cadena separada por comas?La premisa es que sólo se deben usar acciones de Tasker (nada de JavaScript). Los primeros intentos lo han conseguido con una tarea de 11 acciones, pero sospecho que se puede hacer con unas pocas menos. ![]() ¿Algún valiente acepta el mini-reto?
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) Última edición por WillyWeb Día 25/06/18 a las 19:25:32. |
| Gracias de parte de: | ||
|
|
|
#2
|
||||
|
||||
|
Esto es lo que se me ha ocurrido... ;)
Código:
<-> Método 1>
A1: Anchor
A2: For [ Variable:%temp1 Items:grande,la tengo,más,la,quisiera ]
A3: Variable Convert [ Name:%temp1 Function:To Upper Case First Store Result In: ]
A4: Variable Set [ Name:%temp2 To:%temp1, Recurse Variables:Off Do Maths:Off Append:On ]
A5: End For
A6: Flash [ Text:%temp2 Long:On ]
<-> Método 2>
A7: Anchor
A8: Array Set [ Variable Array:%temp1 Values:grande,la tengo,más,la,quisiera Splitter:, ]
A9: Variable Set [ Name:%temp2 To:(%temp2)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A10: Variable Convert [ Name:%temp1(%temp2) Function:To Upper Case First Store Result In:%temp3 ]
A11: Variable Set [ Name:%temp4 To:%temp3 Recurse Variables:Off Do Maths:Off Append:On ]
A12: Variable Set [ Name:%temp4 To:, Recurse Variables:Off Do Maths:Off Append:On ] If [ %temp2 !~ %temp1(#) ]
A13: Goto [ Type:Action Number Number:9 Label: ] If [ %temp2 !~ %temp1(#) ]
A14: Flash [ Text:%temp4 Long:On ]
Última edición por SmartPhoneLover Día 25/06/18 a las 20:20:26. |
| Los siguientes 2 usuarios han agradecido a SmartPhoneLover su comentario: | ||
|
#3
|
||||
|
||||
|
Código:
<-> Método 1>
A1: Anchor
A2: For [ Variable:%temp1 Items:grande,la tengo,más,la,quisiera ]
A3: Variable Convert [ Name:%temp1 Function:To Upper Case First Store Result In: ]
A4: Variable Set [ Name:%temp2 To:%temp1, Recurse Variables:Off Do Maths:Off Append:On ]
A5: End For
A6: Flash [ Text:%temp2 Long:On ]
![]() ![]() No lo he probado, pero juraría que al final saldrá una coma que no debería salir. ![]() Código:
<-> Método 2>
A7: Anchor
A8: Array Set [ Variable Array:%temp1 Values:grande,la tengo,más,la,quisiera Splitter:, ]
A9: Variable Set [ Name:%temp2 To:(%temp2)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A10: Variable Convert [ Name:%temp1(%temp2) Function:To Upper Case First Store Result In:%temp3 ]
A11: Variable Set [ Name:%temp4 To:%temp3 Recurse Variables:Off Do Maths:Off Append:On ]
A12: Variable Set [ Name:%temp4 To:, Recurse Variables:Off Do Maths:Off Append:On ] If [ %temp2 !~ %temp1(#) ]
A13: Goto [ Type:Action Number Number:9 Label: ] If [ %temp2 !~ %temp1(#) ]
A14: Flash [ Text:%temp4 Long:On ]
![]() de %temp1 a %temp10 sin definir %temp11=grande %temp12=la tengo << te falta una coma aquí %temp13=más %temp14=la %temp15=quisiera Yo diría que la tarea funcionará (tampoco la he probado), pero ¿era eso lo que querías hacer?
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Gracias de parte de: | ||
|
#4
|
||||
|
||||
|
Aquí está mi propuesta con Tasker puro...
Código:
PrimeraLetraEnMayúsculas (666) A1: Establecer variable [ Nombre:%org A:grande,la,tengo,más,la,quisiera Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] A2: Establece Array [ Matriz de Variables (array):%org Values:%org Separador:, ] A3: For [ Variable:%ind Ítems:1:%org(#) ] A4: Convertir Variable [ Nombre:%org(%ind) Función:A Mayúsculas Primero Almacenar Resultado en: ] A5: End For A6: Concatenar variable [ Nombre:%org Criterio de fusión:, Borrar partes:Encendido ] ![]() Luego me he puesto a pensar si esto se podía atacar con expresiones regulares ... ![]() Y sí que se puede. ![]() Esto saca la primera letra de cada palabra que esté separada por un espacio en blanco o una coma... (^|\s|,)[a-z] Y esto convierte en mayúsculas cada coincidencia... \U\0 Funciona perfectamente... https://regex101.com/r/HpoJpg/2 Pero al intentar meterlo todo en una acción de "Buscar y Reemplazar" no consigo el resultado deseado, aunque me quedo muy cerca.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#5
|
||||
|
||||
|
Última edición por SmartPhoneLover Día 27/06/18 a las 19:19:18. |
|
#6
|
||||
|
||||
|
Si miras en el enlace que puse antes creo que lo entenderás...
https://regex101.com/r/HpoJpg/2 Con esto ... (^|\s|,)[a-z] ... en REGULAR EXPRESSION y esto ... \U\0 ... en SUBSTITUTION el resultado es el esperado. En la acción de Tasker pongo lo primero en el campo "Buscar" pero al poner lo segundo en el campo "Reemplazar Con" no consigo el resultado que esperaba. Parece que ese segundo campo no admite una expresión regular, o yo no encuentro la forma de ponerla de manera que Tasker la entienda.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#7
|
||||
|
||||
|
Y por qué no probar con sed...?
Se me ocurrió que podriamos hacer toda la operación en una única línea. Pero por ahora solo tengo la parte del código que se encarga de separar las palabras y agregar comas con espacios. echo "%var" | sed 's/,/ /g' Como comenté al principio, la parte del comando sed arriba expuesta, por ahora, lo único que hace es sustituir, en este caso, las comas por espacios. Por lo tanto, las palabras quedarían separadas. Pero por qué? Para qué? Pues, estoy intentado dar con la combinación correcta para hacer que sed convierta la primer letra de cada palabra separada en mayúscula con '\U', pero no hay manera. (sé que es posible) Grrrrr A ver si vosotros encontrais la forma ![]() Entonces, si lograsemos dar con la parte de las expresiones que faltan, la fórmula quedaria tal que así: echo "%var" | sed 's/,/ /g; <expresiones_uppercase>; s/ /, /g;' Notas: - Quizás sea innecesaria la parte previa de eliminación de la coma por espacios, y se pueda omitir. - Si llegase a funcionar, ni siquiera haría failta una acción previa para pasarle las palabras, sino que usando la variable '%par#' podriamos pasar todo directamente. Última edición por SmartPhoneLover Día 27/06/18 a las 22:21:52. |
|
#8
|
||||
|
||||
|
He encontrado una página en la que alguien pregunta lo mismo y recibe (entre otras) la siguiente respuesta que es más evolucionada de lo que buscábamos porque admite varias líneas y porque además pone a minúsculas cualquier posible mayúscula que no esté al inicio de palabra. Código:
echo 'my string ANOTHER STRING tHiRd StRiNg' | sed -En ' y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ :loop h s/^(.*[^a-zA-Z0-9])?([a-z]).*$/\2/ t next b end :next y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ G s/^(.+)\n(.*[^a-zA-Z0-9])?[a-z](.*)$/\2\1\3/ t loop :end p ' Output: My String Another String Third String https://stackoverflow.com/questions/...ing-sed-in-osx También he encontrado una página que es como una enciclopedia dedicada solo al comando SED: http://www.grymoire.com/Unix/Sed.html Saludos.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#9
|
||||
|
||||
|
Madre mia. De usar acciones simples, hemos pasado a la complejidad extrema XD
Muchas gracias Caravantes!!! Muy útil! ;)
|
|
#10
|
||||
|
||||
|
La cuestión en ese post comienza con esto...
Estoy intentando capitalizar la primera letra de cada palabra con esta sentencia "sed" pero no funciona...Lo primero que me llama la atención es que esa "\u" no esté en mayúsculas. ¿Alguien puede verificar que eso está bien/mal?
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#11
|
||||
|
||||
|
Tengo la sospecha de que falla algo más ...
sed 's/\b\(.\)\u\1/g' ... debería ser ... sed 's/\b\(.\)\U\0/g' ¿Alguien lo puede probar?
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#12
|
||||
|
||||
|
Efectivamente, no funciona. Al menos a mi tampoco. Y si cambio la u por U, pasa lo mismo.
Quizás sea un argumento que no venga incluido, al menos, en las applets propias de Android. (he comprobado, y no veo por ningún lugar ningún argumento referente a modificar tamaño de letras) Última edición por SmartPhoneLover Día 28/06/18 a las 21:58:45. |
|
#13
|
||||
|
||||
|
Tasker usa regex flavor Java y una extensión de Perl 5.
Java no soporta \U y no permite modificar una variable directamente. En el campo reemplazar solo se pueden usar referencias a grupos para alterar lo que la propia expresión contiene. |
|
#14
|
||||
|
||||
|
https://regex101.com/r/HpoJpg/2/codegen?language=java Llegados a este punto parece que las tareas a base de acciones de Tasker y/o un pequeño script de JS (que el peticionario no quería usar) son las soluciones más viables.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#15
|
||||
|
||||
|
https://docs.oracle.com/javase/7/doc...x/Pattern.html
Comparison to Perl 5 Perl constructs not supported by this class: The preprocessing operations \l \u, \L, and \U. Creo que el código generado por regex101 no está bien. Si pasas el cursor por sustitución en \U pone: Custom regex101 property Supongo que le habrán dado ese soporte. Regex suele ser mi primera opción para muchas cosas pero no sirve para todo está claro. Ya que Tasker tiene esta función, tampoco está mal hacer uso de ella. |
|
#16
|
||||
|
||||
![]() Está claro que esta vez regex no nos sacará del apuro. Las tareas con acciones de Tasker y el script para sed que dejó Caravantes son la solución a este asunto. Gracias por los datos sobre el soporte regex de Tasker.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#17
|
||||
|
||||
|
Puede que Tasker no soporte el parámetro \U y está claro que "sed" no lo soporta, pero en Java sí parece que se puede usar ...
https://regex101.com/r/HpoJpg/2/codegen?language=java Llegados a este punto parece que las tareas a base de acciones de Tasker y/o un pequeño script de JS (que el peticionario no quería usar) son las soluciones más viables. ![]() ![]() String temp1 = tasker; temp2 = temp1.charAt(0); temp3 = String(temp2); %temp = temp3.toUpperCase(); Luego, continuas o con la función 'replaceFirst' o concatenate, or tiras de acciones de variables en Tasker para volver a juntar esa letra ya capitalizada al resto del cuerpo de 'asker'. - - - - - - - - - - - - - - - - - - - - - - - - - EDITO No había visto bien el código que has puesto en el enlace. El tuyo es más eficiente. Usas directamente la expresión ;) Gracias WillyWeb! No se me habría ocurrido hacer uso de ella de ese modo. Última edición por SmartPhoneLover Día 30/06/18 a las 20:33:35. |
|
#18
|
||||
|
||||
|
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
|
#19
|
||||
|
||||
|
No, eso está fuera de mi comarca. Smart escribió "Y por qué no probar con sed...?" lo cual picó un poco mi curiosidad (nadie me había presentado a ese SED); por eso hice una búsqueda en Google y encontré eso que parece servir para resolver el problema, pero yo solo pretendía pasarle esa pista a Smart o a cualquier otro que tenga soltura con SED y comandos parecidos. Eso no es un jardín sino un bosque tupido, y lo tengo muy difícil para abrirme camino con mi navaja de boy scout. Acabaría haciéndome daño, o perdido, y seguro que terminaba emitiendo un SOS por morse.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
|
|
#20
|
||||
|
||||
![]() Hombre, no deja de ser un comando de consola. Eso sí, un "poco" más complejo de lo habitual. ![]() https://www.htcmania.com/showthread....6#post29034286
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
![]() |
Estás aquí
|
||||||
|
||||||