sed: -e expresión #1, carácter 73: comando `s' sin terminar

sed: -e expresión #1, carácter 73: comando `s' sin terminar

Soy muy nuevo en SH y en el desarrollo y estoy cometiendo errores en el código, un error a la vez.

Me encontré con este error ahora y no puedo llegar al fondo. ¡Cualquier ayuda sería genial!

Estoy ejecutando un script sh en GitHub Actions y recibo este error:

sed: -e expression #1, char 73: unterminated `s' command

Aquí está mi código:

SPECTESTSFILE='manifest/specifictests.xml'
  cat $SPECTESTSFILE

  BUILDXML_TEMPLATE_FILE='buildFiles/buildrunspecifictests.template.xml'
  SPECTESTS="$(cat $SPECTESTSFILE)"
  echo "Specified Tests: "
  echo $SPECTESTS
  sed -i "s|<runTest><\/runTest>|$SPECTESTS|g" $BUILDXML_TEMPLATE_FILE

En mi archivo manifest/specifictests.xml, tengo una lista de RunTests con nuevas líneas

<runTest>...</runTest>
<runTest>....</runTest>

y quiero insertar esta lista en el archivo buildFiles/buildrunspecifictests.template.xml

<deploy>
    <runTest></runTest>
</deploy>

Finalmente, quiero que el archivo se vea así:

<deploy>
   <runTest>...</runTest>
   <runTest>....</runTest>
</deploy>

Lo que descubrí es que si no hay nuevas líneas en el archivo manifest/specifictests.xml, entonces funciona, pero esto no me permite mucha libertad para que el usuario lo use o, eventualmente, automatice la creación de este archivo en otro lugar.

¿Alguien sabe una solución?

Respuesta1

Parece que ha absorbido todo el contenido del archivo 'manifest/specifictests.xml' en la variable SPECTESTS, y está indicando sedque busque en el archivo 'buildFiles/buildrunspecifictests.template.xml' y reemplace cada aparición del cadena "<runTest></runTest>" con todo el contenido de SPECTESTS.

Como habrás notado, es muy probable que esto se rompa si hay caracteres especiales en Specifictests.xml. En particular, las nuevas líneas en $SPECTESTS están interrumpiendo la mitad del comando "s", como dice el error; Las nuevas líneas tendrían que escaparse para que sed siguiera leyendo el comando.

Parece que todo lo que realmente quieres hacer es anteponer "<deploy>" y agregar "</deploy>" al contenido de Specifictests.xml. ¿Está bien?

En cuyo caso, podrías simplemente hacer

{ echo "<deploy>"; cat "$SPECTESTSFILE"; echo "</deploy>"; } > "$BUILDXML_TEMPLATE_FILE"

Si eso no funciona, entonces, para solucionar específicamente las nuevas líneas en $SPECTESTS, puedes reemplazarlas con otra cosa antes de enviarlas a sed, y luego convertirlas nuevamente en nuevas líneas después de que sed haya terminado, de esta manera:

SPECTESTS="$(tr '\n' '\r' < $SPECTESTSFILE)"
sed "s|<runTest><\/runTest>|$SPECTESTS|g" $BUILDXML_TEMPLATE_FILE | tr '\r' '\n'

Esto coloca el resultado en la salida estándar, no en buildrunspecifictests.template.xml. (Pero parece que es posible que desee el resultado en un archivo diferente de todos modos; de lo contrario, interrumpirá las sustituciones futuras).

Sin embargo, esto todavía es susceptible a que aparezcan otros caracteres problemáticos en $SPECTESTS, como |, & o \.

Puedes probar las soluciones encomando sed para reemplazar una cadena de un archivo con el contenido completo de otro archivo.

información relacionada