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

5

我学会了如何分别去除前缀和后缀,具体操作如下:

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可能会使它变得非常容易,但我倾向于在这里避免使用它。


链接的“重复”问题显然不是重复的。 - pcworld
@pcworld 你投票赞成开放它了吗?这些关闭完全没有意义。 - user1424739
@user1424739 不,我也不知道怎么做,你可以自由尝试。 - pcworld
2个回答

2

介绍一个辅助函数:

$ 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-

0

感谢您提出这个好问题。

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

但是,如果您知道后缀和前缀的长度,那么您可以采用这个简单的解决方案:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接