Substitua o conteúdo que contém novas linhas usando sed

Substitua o conteúdo que contém novas linhas usando sed

Eu tenho um arquivo README markdown que possui marcadores html como este:

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

e quero substituir o texto interno (pode já ter coisas) por novo conteúdo de um arquivo que tenha tags html e caracteres de nova linha (é uma tabela de markdown com html nas células).

Eu estava tentando substituir novas linhas por 0xFF do sed e depois substituí-las novamente 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'

mas isso não funciona, como posso substituir o texto dentro dos marcadores pelo conteúdo dos CONTRIBUIDORES?

Estava funcionando quando eu uso tr '\n' '\xFF', mas estava substituindo a nova linha por x.

Encontrei este artigoSed: Substituição de múltiplas linhas entre dois padrõese experimente usando:

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

(Substituí / por% no comando s), mas ocorreu um erro:

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

Responder1

Eu usei esse hack, simplesmente converti novas linhas em caracteres Unicode sorridentes "☺", enquanto fazia a substituição do sed, pois as novas linhas estavam 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

informação relacionada