0 votos

Usando sed para reemplazar líneas se obtienen dos líneas por cada una reemplazada

He estado intentando automatizar algo, usando sed en un bucle quería hacer esto:

while IFS= read -r line; do
  sed -r -i '' "\"s|::set-output name=(.*)::(.*)\"|\"\1=\2\" >> \$GITHUB_OUTPUT|p" "$line"
done < <(grep -RIl "::set-output" | sort -u)

Esto debe alimentar una lista de archivos devueltos por grep que coincidan con el patrón a sed, que debe reemplazar cada línea con una línea similar que coincida con el nuevo formato que quiero.

Esto parece funcionar bien, pero tiene algunos resultados no deseados que no puedo explicar, cada vez que reemplaza una línea, resulta en dos nuevas líneas. No sé qué comportamiento está causando esto y mis búsquedas iniciales sobre el tema no han dado lugar a mucha información útil y no estoy seguro de qué buscar en.

Para reproducir el problema set -x ejecuté mi bucle y tomé una de las líneas de la salida de depuración. He restablecido mi repo a los valores por defecto con git stash y luego lo hizo:

$ sed -r -i '' 's|"::set-output name=(.*)::(.*)"|"\1=\2" >> $GITHUB_OUTPUT|p' ./.github/workflows/platform-status.yml

Ahora puedo ver en el git diff que ha sustituido mi antigua línea por dos líneas idénticas:

-          echo "::set-output name=version::${VERSION}"
+          echo "version=${VERSION}" >> $GITHUB_OUTPUT
+          echo "version=${VERSION}" >> $GITHUB_OUTPUT

No entiendo de dónde viene la segunda línea y no esperaría este comportamiento del sed, ¿alguien puede decirme qué estoy haciendo mal?

1voto

Kristof Claes Puntos 5867

Encontré un post en Stack Overflow que sugería utilizar perl en su lugar:

sed -r -i ''

se convierte en

perl -pi -e

Y funciona exactamente como esperaba

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X