Заменить последнее вхождение подстроки в строке (bash) - PullRequest
0 голосов
/ 26 июня 2018

Из руководства по программному обеспечению bash:

${parameter/pattern/string}

Шаблон расширяется для получения шаблон так же, как в расширении имени файла. Параметр расширен и самое длинное совпадение шаблона с его значением заменяется на строку.
... Если шаблон начинается с ‘%’, он должен совпадать в конце расширенного значения параметра.

И вот я попробовал:

local new_name=${file/%old/new}

Где строка - это абсолютный путь к файлу (/abc/defg/hij, old и new - переменные строки.

Однако, похоже, что он пытается соответствовать буквальному значению %sb1.

Какой синтаксис для этого?

Ожидаемый результат:

учитывая

old=sb1
new=sb2

Тогда

/foo/sb1/foo/bar/sb1 должно стать /foo/sb1/foo/bar/sb2

/foo/foosb1other/foo/bar/foosb1bar должно стать /foo/foosb1other/foo/bar/foosb2bar

1 Ответ

0 голосов
/ 26 июня 2018

Использование только встроенного в оболочку расширения параметра :

src=sb1; dest=sb2
old=/foo/foosb1other/foo/bar/foosb1bar

if [[ $old = *"$src"* ]]; then
  prefix=${old%"$src"*}                  # Extract content before the last instance
  suffix=${old#"$prefix"}                # Extract content *after* our prefix
  new=${prefix}${suffix/"$src"/"$dest"}  # Append unmodified prefix w/ suffix w/ replacement
else
  new=$old
fi

declare -p new >&2

... правильно выбрасывает:

declare -- new="/foo/foosb1other/foo/bar/foosb2bar"
...