#!/bin/bash
# The need is to only replace $pattern inside $whole_text, and return the rest
# of the input untouched. But currently is only returning the matched line.
# I'm not sure if it's needed, but as @EdMorton recommends, it may be good idea
# to import the variables in a safer way, as explained here:
# http://c...content-available-to-author-only...n.com/shell/cus-faq-2.html#Q24
#
# Form "d" seems to be the best for compatibility and features:
#
# awk 'BEGIN{avar=ARGV[1];ARGV[1]=""}$0 == avar' "$svar" file
# The following variables really can contain ANY printable character.
# But in order to simplify, here they don't support single quotes.
pattern ='<!-- %cmd: for F in $(find ../[0-9]* -maxdepth 0 -type d | sed "s/^\.\.\///"); do echo "<li><a href=\"$F\">$F</a></li>"; done -->'
container ='
<h2>Title</h2>
<ul>
<!-- %cmd: for F in $(find ../[0-9]* -maxdepth 0 -type d | sed "s/^\.\.\///"); do echo "<li><a href=\"$F\">$F</a></li>"; done -->
</ul>
'
container2 ="line 1\n line 2\n $pattern \n line3\n line4"
echo "-------- A: anuhava proposal d22"
echo "-------- problem: doesn't print non-matched lines"
awk -v repl ="newtext" 'FNR==NR {
a = a $0; next
}
n = index($0, a) {
print substr($0, 1, n-1) repl substr($0, n+length(a))
}' < ( printf "%s\n " "$pattern " ) < ( echo "$container " )
echo "-------- B: anubhava proposal d29 15:30"
echo "-------- It seems to work, need to check receiving text through variable (see C)"
awk -v repl ="newtext" 'FNR==NR {
a = a $0; next
} n = index($0, a) {
$0 = substr($0, 1, n-1) repl substr($0, n+length(a))
} 1' < ( printf "%s\n " "$pattern " ) < ( printf 'line 1\nline 2\nbefore %s after\nline 3\nline 4\n' "$pattern " )
echo "-------- C: modified last proposal to receive container text through variable"
echo "-------- IT WORKS!"
awk -v repl ="newtext" 'FNR==NR {
a = a $0; next
} n = index($0, a) {
$0 = substr($0, 1, n-1) repl substr($0, n+length(a))
} 1' < ( printf "%s\n " "$pattern " ) < ( printf '%s' "$container " )
IyEvYmluL2Jhc2gKCiMgVGhlIG5lZWQgaXMgdG8gb25seSByZXBsYWNlICRwYXR0ZXJuIGluc2lkZSAkd2hvbGVfdGV4dCwgYW5kIHJldHVybiB0aGUgcmVzdAojIG9mIHRoZSBpbnB1dCB1bnRvdWNoZWQuIEJ1dCBjdXJyZW50bHkgaXMgb25seSByZXR1cm5pbmcgdGhlIG1hdGNoZWQgbGluZS4KCiMgSSdtIG5vdCBzdXJlIGlmIGl0J3MgbmVlZGVkLCBidXQgYXMgQEVkTW9ydG9uIHJlY29tbWVuZHMsIGl0IG1heSBiZSBnb29kIGlkZWEKIyB0byBpbXBvcnQgdGhlIHZhcmlhYmxlcyBpbiBhIHNhZmVyIHdheSwgYXMgZXhwbGFpbmVkIGhlcmU6CiMgICAgIGh0dHA6Ly9jLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5uLmNvbS9zaGVsbC9jdXMtZmFxLTIuaHRtbCNRMjQKIwojIEZvcm0gImQiIHNlZW1zIHRvIGJlIHRoZSBiZXN0IGZvciBjb21wYXRpYmlsaXR5IGFuZCBmZWF0dXJlczoKIwojICAgICBhd2sgJ0JFR0lOe2F2YXI9QVJHVlsxXTtBUkdWWzFdPSIifSQwID09IGF2YXInICIkc3ZhciIgZmlsZQoKIyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyByZWFsbHkgY2FuIGNvbnRhaW4gQU5ZIHByaW50YWJsZSBjaGFyYWN0ZXIuCiMgQnV0IGluIG9yZGVyIHRvIHNpbXBsaWZ5LCBoZXJlIHRoZXkgZG9uJ3Qgc3VwcG9ydCBzaW5nbGUgcXVvdGVzLgpwYXR0ZXJuPSc8IS0tICVjbWQ6IGZvciBGIGluICQoZmluZCAuLi9bMC05XSogLW1heGRlcHRoIDAgLXR5cGUgZCB8IHNlZCAicy9eXC5cLlwvLy8iKTsgZG8gZWNobyAiPGxpPjxhIGhyZWY9XCIkRlwiPiRGPC9hPjwvbGk+IjsgZG9uZSAtLT4nCmNvbnRhaW5lcj0nCiAgICA8aDI+VGl0bGU8L2gyPgogICAgPHVsPgogICAgICAgIDwhLS0gJWNtZDogZm9yIEYgaW4gJChmaW5kIC4uL1swLTldKiAtbWF4ZGVwdGggMCAtdHlwZSBkIHwgc2VkICJzL15cLlwuXC8vLyIpOyBkbyBlY2hvICI8bGk+PGEgaHJlZj1cIiRGXCI+JEY8L2E+PC9saT4iOyBkb25lIC0tPgogICAgPC91bD4KJwpjb250YWluZXIyPSJsaW5lIDFcbmxpbmUgMlxuJHBhdHRlcm5cbmxpbmUzXG5saW5lNCIKIAplY2hvICItLS0tLS0tLSBBOiBhbnVoYXZhIHByb3Bvc2FsIGQyMiIKZWNobyAiLS0tLS0tLS0gcHJvYmxlbTogZG9lc24ndCBwcmludCBub24tbWF0Y2hlZCBsaW5lcyIKCmF3ayAtdiByZXBsPSJuZXd0ZXh0IiAnRk5SPT1OUiB7CglhID0gYSAkMDsgbmV4dAp9Cm4gPSBpbmRleCgkMCwgYSkgewoJcHJpbnQgc3Vic3RyKCQwLCAxLCBuLTEpIHJlcGwgc3Vic3RyKCQwLCBuK2xlbmd0aChhKSkKfScgPChwcmludGYgIiVzXG4iICIkcGF0dGVybiIpIDwoZWNobyAiJGNvbnRhaW5lciIpCgoKCmVjaG8gIi0tLS0tLS0tIEI6IGFudWJoYXZhIHByb3Bvc2FsIGQyOSAxNTozMCIKZWNobyAiLS0tLS0tLS0gSXQgc2VlbXMgdG8gd29yaywgbmVlZCB0byBjaGVjayByZWNlaXZpbmcgdGV4dCB0aHJvdWdoIHZhcmlhYmxlIChzZWUgQykiCgphd2sgLXYgcmVwbD0ibmV3dGV4dCIgJ0ZOUj09TlIgewoJYSA9IGEgJDA7IG5leHQKfSBuID0gaW5kZXgoJDAsIGEpIHsKCSQwID0gc3Vic3RyKCQwLCAxLCBuLTEpIHJlcGwgc3Vic3RyKCQwLCBuK2xlbmd0aChhKSkKfSAxJyA8KHByaW50ZiAiJXNcbiIgIiRwYXR0ZXJuIikgPChwcmludGYgJ2xpbmUgMVxubGluZSAyXG5iZWZvcmUgJXMgYWZ0ZXJcbmxpbmUgM1xubGluZSA0XG4nICIkcGF0dGVybiIpCgoKZWNobyAiLS0tLS0tLS0gQzogbW9kaWZpZWQgbGFzdCBwcm9wb3NhbCB0byByZWNlaXZlIGNvbnRhaW5lciB0ZXh0IHRocm91Z2ggdmFyaWFibGUiCmVjaG8gIi0tLS0tLS0tIElUIFdPUktTISIKCmF3ayAtdiByZXBsPSJuZXd0ZXh0IiAnRk5SPT1OUiB7CglhID0gYSAkMDsgbmV4dAp9IG4gPSBpbmRleCgkMCwgYSkgewoJJDAgPSBzdWJzdHIoJDAsIDEsIG4tMSkgcmVwbCBzdWJzdHIoJDAsIG4rbGVuZ3RoKGEpKQp9IDEnIDwocHJpbnRmICIlc1xuIiAiJHBhdHRlcm4iKSA8KHByaW50ZiAnJXMnICIkY29udGFpbmVyIikK