Bash 一步从变量中删除尾字符串和前导字符串

Bash 一步从变量中删除尾字符串和前导字符串,bash,Bash,变量f中有一个字符串是“res/some/path/file.ext.patch”,我想删除“.patch”和“res/”。 这意味着我希望结果是“some/path/file.ext” 我知道我可以用${f#res/}删除前面的“res/”,用${f%.patch}删除后面的“.patch” 我想在不使用临时变量的情况下一步替换这两个变量,因此我尝试了以下方法: ${${f#res/}%.patch}但我得到以下错误: /bin/bash:${${f#res/}%.patch}:变量替换错误。

变量f中有一个字符串是“res/some/path/file.ext.patch”,我想删除“.patch”和“res/”。 这意味着我希望结果是“some/path/file.ext”

我知道我可以用
${f#res/}
删除前面的“res/”,用
${f%.patch}
删除后面的“.patch”

我想在不使用临时变量的情况下一步替换这两个变量,因此我尝试了以下方法:
${${f#res/}%.patch}
但我得到以下错误:

/bin/bash:${${f#res/}%.patch}:变量替换错误。


什么

参数扩展运算符不能链接。在一个步骤中,最接近做到这一点的方法是使用正则表达式匹配

[[ $f =~ res/(.*).patch ]] && f=${BASH_REMATCH[1]}
我把这件事交给你,如果你愿意的话

f=${f#res/}
f=${f%.patch}

无法链接参数扩展运算符。在一个步骤中,最接近做到这一点的方法是使用正则表达式匹配

[[ $f =~ res/(.*).patch ]] && f=${BASH_REMATCH[1]}
我把这件事交给你,如果你愿意的话

f=${f#res/}
f=${f%.patch}

你不能像这样连锁经营者。在
%
之前只允许有一个名称,而不是任意值。
$(echo$file | sed的#^res/\(.*)\)\。patch$\1#')
不能像这样链接运算符。
%
之前只允许有一个名称,而不是任意值。
$(echo$file | sed的#^res/\(.*)\。patch$\1#')