es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La retroreferencia en awk gensub con ramificación condicional.

Me estoy refiriendo a la respuesta a: GNU awk: acceder a grupos capturados en el texto de reemplazo, pero con el cuantificador “?” para la coincidencia de expresiones regulares.

Me gustaría hacer una declaración “if” o un operador ternario “?:” o algo más elegante para que, si el grupo de expresión regular al que se hace referencia con “\1” devuelve una cadena no vacía, se inserte una cadena arbitraria (sin excluir “\1”) y si devuelve una cadena vacía, se inserte otra cadena arbitraria. Mi ejemplo funciona cuando el grupo de captura devuelve una cadena no vacía, pero no devuelve la rama “B” esperada cuando la referencia posterior está vacía. ¿Cómo puedo hacer una rama condicional basada en los valores de referencia posterior?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr una ramificación condicional basada en los valores de referencia hacia atrás, utilizando el cuantificador ? en awk, es utilizar el operador ternario ?:. En el ejemplo proporcionado, la referencia hacia atrás \\1 se utiliza como condición para el operador ternario. Si \\1 no está vacío (es decir, contiene una o más ocurrencias de b), se inserta la cadena “A”, de lo contrario se inserta la cadena “B”.

    Sin embargo, el ejemplo proporcionado no funciona como se espera cuando \\1 está vacío. Esto se debe a que el operador ternario solo considera si \\1 está vacío o no, pero no distingue entre una cadena vacía y una referencia hacia atrás inexistente. Para manejar este caso, se puede utilizar la función length() para verificar la longitud de la referencia hacia atrás en lugar de utilizarla directamente como condición.

    El ejemplo corregido utilizando la función length() sería:

    echo abba | awk '{ print gensub(/a(b*)?a/, (length("\\1") > 0)? "A" : "B", "g", $0)}'
    

    Esto debería producir correctamente la salida “A” para la cadena de entrada “abba” y “B” para cualquier otra cadena que coincida con la expresión regular.

Comments are closed.