Reemplazar contenido que tenga nuevas líneas usando sed

Reemplazar contenido que tenga nuevas líneas usando sed

Tengo un archivo README de rebajas que tiene marcadores html como este:

<!-- CONTRIBUTORS-START -->
<!-- CONTRIBUTORS-END -->

y quiero reemplazar el texto dentro (es posible que ya tenga cosas) con contenido nuevo de un archivo que tiene etiquetas html y caracteres de nueva línea (es una tabla de rebajas con html en celdas).

Estaba intentando reemplazar las nuevas líneas con 0xFF do sed y luego reemplazarlas nuevamente usando este código:

CONTRIBUTORS=`./contributors -u jcubic -r jquery.terminal -m | tr '\n' $'\xFF'`
# contributors script get data from github and display markdown table
# or ERROR if rate limit reached

echo "$CONTRIBUTORS" | grep ERROR > /dev/null || cat README.in | tr '\n' $'\xFF' | \
    sed -e "s%\(<!-- CONTRIBUTORS-START -->\).*\(<!-- CONTRIBUTORS-END -->\)%\1\n${CONTRIBUTORS}\2%" #| tr $'\xFF' '\n'

pero esto no funciona, ¿cómo puedo reemplazar el texto dentro de los marcadores con contenido de COLABORADORES?

Funcionaba un poco cuando lo uso tr '\n' '\xFF', pero estaba reemplazando la nueva línea por x.

encontré este artículoSed: Reemplazo de múltiples líneas entre dos patronesy pruébalo usando:

sed -n "/CONTRIBUTORS-START/{p;:a;N;/CONTRIBUTORS-END/!ba;s%.*\n%${CONTRIBUTORS}\n%};p"

(Reemplacé / por % en el comando s) pero obtuve el error:

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

Respuesta1

Utilicé este truco, simplemente convertí nuevas líneas en un carácter Unicode sonriente "☺", mientras reemplazaba sed, ya que las nuevas líneas estaban causando problemas.

CONTRIBUTORS=`./contributors -u jcubic -r jquery.terminal -m $@  | tr '\n' '☺'`

if echo "$CONTRIBUTORS" | grep ERROR > /dev/null; then
    echo "$CONTRIBUTORS" | tr '☺' '\n'
else
    cat README.in | sed -n "/CONTRIBUTORS-START/{p;:a;N;/CONTRIBUTORS-END/!ba;s%.*\n%${CONTRIBUTORS}%};p" | tr '☺' '\n' > README.tmp
    cp README.tmp README.in
    rm README.tmp
fi

información relacionada