有没有一种方法可以在BASH中使用#和%一次性删除前缀和后缀?

有没有一种方法可以在BASH中使用#和%一次性删除前缀和后缀?,bash,Bash,我学习了如何分别删除前缀和后缀,如下所示: p="prefix-foo-bar-suffix" echo ${p#prefix} # -foo-bar-suffix echo ${p%suffix} # prefix-foo-bar- 我正试图根据上面的例子找出如何将它们一起删除。我尝试了下面的代码,但不起作用 echo ${p#prefix%suffix} # prefix-foo-bar-suffix, looks like it treats "prefix%suffi

我学习了如何分别删除前缀和后缀,如下所示:

p="prefix-foo-bar-suffix"
echo ${p#prefix}    # -foo-bar-suffix
echo ${p%suffix}    # prefix-foo-bar-
我正试图根据上面的例子找出如何将它们一起删除。我尝试了下面的代码,但不起作用

echo ${p#prefix%suffix}    # prefix-foo-bar-suffix, looks like it treats "prefix%suffix" as a whole thing
echo ${{p#prefix}%suffix}    # error, bad substitution

另外,我知道使用正则表达式应该很容易实现,但这里我想知道是否有可能构建一个仅基于#和%技巧的解决方案。此外,使用eval可能会使它变得非常简单,但正如一些人所建议的,我在这里倾向于避免使用eval。

引入一个helper函数:

$ trim() { local x="${1#"$2"}"; echo "${x%"$3"}"; }
$ trim prefix-foo-bar-suffix prefix suffix
-foo-bar-
$ trim prefix-foo-bar-suffix prefix
-foo-bar-suffix
$ trim prefix-foo-bar-suffix "" suffix
prefix-foo-bar-

谢谢你的提问

联合使用前缀和后缀是不可能的,或者我只是在文档中找不到它

但是,如果您知道后缀和前缀的长度,则可以使用此简单解决方案:

echo ${p:6: $[ ${#p}-12 ]}