从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$//
…但只是因为:
- 回声不关心有多less个string在它的参数列表中
- $ prefix和$ suffix中没有空格
在命令行中引用一个string通常是很好的做法,因为即使它包含空格,它也会作为一个参数呈现给命令。 我们引用$ prefix和$ suffix是出于同样的原因:每个sed编辑命令将作为一个string传递。 我们使用双引号,因为它们允许可变插值; 如果我们使用了单引号,sed命令会得到一个字面的$prefix
和$suffix
,这当然不是我们想要的。
请注意,在设置variablesprefix
和suffix
时,我使用了单引号。 我们当然不希望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