替换字符串(bash)中最后出现的子字符串

替换字符串(bash)中最后出现的子字符串,bash,shell,pattern-matching,substring,variable-expansion,Bash,Shell,Pattern Matching,Substring,Variable Expansion,从bash软件手册: ${parameter/pattern/string} 该模式被扩展以生成一个 模式与文件名扩展中的模式相同。参数被展开,并且 模式与其值的最长匹配替换为字符串。 ... 如果模式以“%”开头,则它必须匹配 在参数展开值的末尾 所以我试过: local new_name=${file/%old/new} 其中字符串是绝对文件路径(/abc/defg/hij和旧的和新的是可变字符串 但是,这似乎是在试图匹配文本%sb1 这个的语法是什么 预期产出: 给定 old=sb1 n

从bash软件手册:

${parameter/pattern/string}

该模式被扩展以生成一个 模式与文件名扩展中的模式相同。参数被展开,并且 模式与其值的最长匹配替换为字符串。
... 如果模式以“
%
”开头,则它必须匹配 在参数展开值的末尾

所以我试过:

local new_name=${file/%old/new}
其中字符串是绝对文件路径(
/abc/defg/hij
旧的
新的
是可变字符串

但是,这似乎是在试图匹配文本
%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
仅使用shell内置:

…正确地发射:

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

@anubhava很快改变了那里的需求,因为我意识到我真正需要的是什么,尽管它也可以使用文字。
declare -- new="/foo/foosb1other/foo/bar/foosb2bar"