#!/bin/bash
# ideone boilerplate: run in temp dir
t =$( mktemp -d -t ideone.XXXXXXXX) || exit
trap 'rm -rf "$t"' ERR EXIT
cd "$t "
cat << \: > file.txt
* some code*
* some code*
string_to_replace
* some code*
:
replacement ='line number 1
line number 2
line number 3% & then \some'
# Generate a sed script out of the replacement
# Escape any regex specials and newlines, and wrap in
# s%string_to_replace%...%g
sed -e 's/[&%\\]/\\&/g' \
-e '$!s/$/\\/' \
-e '1s/^/s%string_to_replace%/' \
-e '$s/$/%g/' <<< $replacement |
# save result so we can display it
tee generated.sed |
# pass to second sed instance
sed -f - file.txt
tail / dev/ null generated.sed
IyEvYmluL2Jhc2gKCiMgaWRlb25lIGJvaWxlcnBsYXRlOiBydW4gaW4gdGVtcCBkaXIKdD0kKG1rdGVtcCAtZCAtdCBpZGVvbmUuWFhYWFhYWFgpIHx8IGV4aXQKdHJhcCAncm0gLXJmICIkdCInIEVSUiBFWElUCmNkICIkdCIKIApjYXQgPDxcOiA+ZmlsZS50eHQKKnNvbWUgY29kZSoKKnNvbWUgY29kZSoKc3RyaW5nX3RvX3JlcGxhY2UKKnNvbWUgY29kZSoKOgogCnJlcGxhY2VtZW50PSdsaW5lIG51bWJlciAxCmxpbmUgbnVtYmVyIDIKbGluZSBudW1iZXIgMyUgJiB0aGVuIFxzb21lJwogCiMgR2VuZXJhdGUgYSBzZWQgc2NyaXB0IG91dCBvZiB0aGUgcmVwbGFjZW1lbnQKIyBFc2NhcGUgYW55IHJlZ2V4IHNwZWNpYWxzIGFuZCBuZXdsaW5lcywgYW5kIHdyYXAgaW4KIyBzJXN0cmluZ190b19yZXBsYWNlJS4uLiVnCnNlZCAtZSAncy9bJiVcXF0vXFwmL2cnIFwKICAgIC1lICckIXMvJC9cXC8nIFwKICAgIC1lICcxcy9eL3Mlc3RyaW5nX3RvX3JlcGxhY2UlLycgXAogICAgIC1lICckcy8kLyVnLycgPDw8JHJlcGxhY2VtZW50IHwKIyBzYXZlIHJlc3VsdCBzbyB3ZSBjYW4gZGlzcGxheSBpdAp0ZWUgZ2VuZXJhdGVkLnNlZCB8CiMgcGFzcyB0byBzZWNvbmQgc2VkIGluc3RhbmNlCnNlZCAtZiAtIGZpbGUudHh0Cgp0YWlsIC9kZXYvbnVsbCBnZW5lcmF0ZWQuc2Vk