Чтобы заменить только последнее совпадение, замените
result="$(printf "%s" "$target" | sed "s/${search}$/${replace}/g")
с
result="$(printf "%s" "$target" | sed "s/\(.*\)${search}/\1${replace}/")"
$
соответствует концу строки, а не последнему шаблону поиска, и вам не нужен модификатор g
, так как существует (не более )одной замены.
\(.*\)
является жадным и sed
сопоставляет все до того, как найдет последний шаблон $search
. И поскольку мы не хотим удалять эту часть, мы должны включить ее как \1
в замену.
Примечания:
#!/bin/bash
в первой строке. -e
еще не ()реализовано. Существует множество переменных, которые используются только один раз. Их удаление сделает ваш код намного чище, например. функция searchReplaceLastMatchOnly()
может быть сведена к
function searchReplaceLastMatchOnly() {
printf "%s" "${1:- }" | sed "s/\(.*\)${2:- }/\1${3:- }/"
}