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.

Obteniendo errores al usar variables con sed, pero obteniendo el resultado deseado en la línea de comandos.

Tengo en mi script de Bash una línea de código:

url=$(echo "$url" | sed -r 's@{$regex}@\2\3.v1\4@')

donde:

  • url = " - https://ci-files.gr4bb.com/templates/v2/kubeval.src.yml"
  • regex = ^(.*)(https://ci-files\.gr4bb\.com/)templates/v2/(.+)(\.ya?ml)$

Esta línea de código fallará con el siguiente error:

sed: -e expression #1, char 21: expresión regular precedente no válida

La posición del carácter 21 correspondería a la letra “e” en la expresión regular.

Sin embargo, si ejecuto esto en la línea de comandos:

echo "  - https://ci-files.gr4bb.com/templates/v2/kubeval.src.yml" | sed -r 's@^(.*)(https://ci-files.gr4bb.com/)templates/v2/(.+)(\.ya?ml)$@\2\3.v1\4@'

Obtengo el resultado deseado, que es:

https://ci-files.gr4bb.com/kubeval.src.v1.yml

Si reemplazo las comillas simples con comillas dobles en la expresión:

url=$(echo "$url" | sed -r "s@{$regex}@\2\3.v1\4@")

Obtengo un error diferente:

sed: -e expression #1, char 32: referencia no válida \4 en el comando 's' RHS

¿Alguien puede explicar exactamente qué está sucediendo?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema con la primera línea de código se debe al uso de llaves {} alrededor de la variable regex dentro del comando sed. Las llaves se usan en sed para especificar rangos o conteos de repetición, por lo que la terminal las interpreta como tal y no pasa el valor de la variable correctamente a sed.

    En cuanto a la segunda línea de código con comillas dobles, el problema se debe al uso de barras invertidas antes de las referencias numéricas (es decir, \2, \3, \4). Al usar comillas dobles, la terminal interpreta las barras invertidas como caracteres de escape, por lo que las referencias numéricas no se pasan correctamente a sed.

    La solución recomendada es cambiar las llaves por paréntesis en la primera línea de código y eliminar las barras invertidas en la segunda línea de código:

    url=$(echo "$url" | sed -r "s@($regex)@\2\3.v1\4@")
    

    Esto debería sustituir correctamente la parte coincidente de la URL con la cadena deseada.

Comments are closed.