从Bash中的string中删除一个固定的前缀/后缀

在我的bash脚本中,我有一个string和它的前缀/后缀。 我需要从原始string中删除前缀/后缀。

例如,假设我有以下值:

 string="hello-world" prefix="hell" suffix="ld" 

我如何得到以下结果?

 result="o-wor" 
 $ foo=${string#$prefix} $ foo=${foo%$suffix} $ echo "${foo}" o-wor 

使用sed:

 $ echo "$string" | sed -e "s/^$prefix//" -e "s/$suffix$//" o-wor 

在sed命令中, ^字符匹配以$prefix开头的文本,尾部$匹配以$suffix结尾的文本。

AdrianFrühwirth在下面的评论中提出了一些好的观点,但是sed为此目的可能是非常有用的。 $ prefix和$ suffix的内容被sed解释的事实可以是好的或坏的,只要你注意,你应该没问题。 美是,你可以做这样的事情:

 $ prefix='^.*ll' $ suffix='ld$' $ echo "$string" | sed -e "s/^$prefix//" -e "s/$suffix$//" o-wor 

这可能是你想要的,并且比bashvariablesreplace更有趣,更强大。 如果你记得拥有巨大的权力(如蜘蛛侠说的),那么你应该没问题。

可以在http://evc-cit.info/cit052/sed_tutorial.htmlfindsed的快速介绍;

关于shell及其string使用的注释:

对于给出的具体例子,下面也是如此:

 $ echo $string | sed -es/^$prefix// -es/$suffix$// 

…但只是因为:

  1. 回声不关心有多less个string在它的参数列表中
  2. $ prefix和$ suffix中没有空格

在命令行中引用一个string通常是很好的做法,因为即使它包含空格,它也会作为一个参数呈现给命令。 我们引用$ prefix和$ suffix是出于同样的原因:每个sed编辑命令将作为一个string传递。 我们使用双引号,因为它们允许可变插值; 如果我们使用了单引号,sed命令会得到一个字面的$prefix$suffix ,这当然不是我们想要的。

请注意,在设置variablesprefixsuffix时,我使用了单引号。 我们当然不希望string中的任何东西被解释,所以我们单引号,所以没有插值发生。 再次,在这个例子中可能没有必要,但这是一个很好的习惯。

我使用grep从path中删除前缀(通过sed处理不好):

 echo "$input" | grep -oP "^$prefix\K.*" 

\K从匹配中删除所有的字符。

你知道你的前缀和后缀的长度吗? 在你的情况下:

 result=$(echo $string | cut -c5- | rev | cut -c3- | rev) 

或者更一般的:

 result=$(echo $string | cut -c$((${#prefix}+1))- | rev | cut -c$((${#suffix}+1))- | rev) 

但AdrianFrühwirth的解决scheme非常酷! 我不知道!

小而通用的解决scheme:

 expr "$string" : "$prefix\(.*\)$suffix" 

使用@AdrianFrühwirth回答:

 function strip { local STRING=${1#$"$2"} echo ${STRING%$"$2"} } 

像这样使用它

 HELLO=":hello:" HELLO=$(strip "$HELLO" ":") echo $HELLO # hello