As substituições de parâmetro podem ser usadas para substituir texto sem problemas de escape:
output=$(ls -t downloads | while IFS= read -r f; do
echo "<a href=\"downloads/$f\">$f</a>"
done)
html=$(<index.html)
html=${html/placeholder/$output}
echo "$html" > output.html
Você também pode usar awk -v
para passar o texto de substituição como uma variável:
awk -v v="$output" '{sub("placeholder",v);print}' index.html > output.html
Ou use o Ruby para substituir um padrão de várias linhas sem exigir um marcador:
echo "$output" | ruby -i -e 'print gets(nil).sub(/<a .*<\/a>\n/m, STDIN.read)' index.html