Substituir conteúdo que tenha novas linhas usando sed

0

Eu tenho um arquivo README markdown que tem marcadores HTML como este:

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

e eu quero substituir o texto dentro (pode já ter coisas) com novo conteúdo de um arquivo que tem tags html e caracteres newline (é markdown table com html nas células).

Eu estava tentando substituir as novas linhas por 0xFF do sed e depois substituí-lo 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 -->\)%\n${CONTRIBUTORS}%" #| tr $'\xFF' '\n'

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

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

Encontrei este artigo Sed: substituição de várias linhas entre dois padrões e tente usar:

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

(Eu substituí / por% no comando s) mas recebi um erro:

sed: -e expression #1, char 1630: unterminated 's' command
    
por jcubic 17.04.2017 / 11:37

1 resposta

0

Eu usei este hack, eu simplesmente convertei novas linhas para smiley Unicode character "☺" , enquanto fazia a substituição do sed, já que newlines 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
    
por 07.05.2017 / 16:53

Tags