我想从字符串中删除前缀/后缀。例如,给定:
string="hello-world"
prefix="hell"
suffix="ld"
如何得到以下结果?
"o-wor"
我想从字符串中删除前缀/后缀。例如,给定:
string="hello-world"
prefix="hell"
suffix="ld"
如何得到以下结果?
"o-wor"
当前回答
注:不确定这在2013年是否可能,但今天(2021年10月10日)肯定是可能的,所以增加了另一个选项…
由于我们处理的是已知的固定长度字符串(前缀和后缀),因此可以使用bash子字符串通过单个操作获得所需的结果。
输入:
string="hello-world"
prefix="hell"
suffix="ld"
计划:
Bash子字符串语法:${字符串:<开始>:<长度>} 跳过prefix="hell"意味着我们的<start>将是4 <length>将是字符串的总长度(${#string})减去固定长度的字符串长度(hell为4 / ld为2)
这给了我们:
$ echo "${string:4:(${#string}-4-2)}"
o-wor
注意:可以删除paren,仍然得到相同的结果
如果prefix和suffix的值未知,或者可能会变化,我们仍然可以使用相同的操作,但将4和2分别替换为${#prefix}和${#suffix}:
$ echo "${string:${#prefix}:${#string}-${#prefix}-${#suffix}}"
o-wor
其他回答
你知道你的前缀和后缀的长度吗?在你的情况下:
result=$(echo $string | cut -c5- | rev | cut -c3- | rev)
或者更一般地说:
result=$(echo $string | cut -c$((${#prefix}+1))- | rev | cut -c$((${#suffix}+1))- | rev)
但是Adrian Frühwirth的解决方案非常酷!我不知道!
我使用grep从路径中删除前缀(sed处理不好):
echo "$input" | grep -oP "^$prefix\K.*"
\K从匹配中删除它之前的所有字符。
注:不确定这在2013年是否可能,但今天(2021年10月10日)肯定是可能的,所以增加了另一个选项…
由于我们处理的是已知的固定长度字符串(前缀和后缀),因此可以使用bash子字符串通过单个操作获得所需的结果。
输入:
string="hello-world"
prefix="hell"
suffix="ld"
计划:
Bash子字符串语法:${字符串:<开始>:<长度>} 跳过prefix="hell"意味着我们的<start>将是4 <length>将是字符串的总长度(${#string})减去固定长度的字符串长度(hell为4 / ld为2)
这给了我们:
$ echo "${string:4:(${#string}-4-2)}"
o-wor
注意:可以删除paren,仍然得到相同的结果
如果prefix和suffix的值未知,或者可能会变化,我们仍然可以使用相同的操作,但将4和2分别替换为${#prefix}和${#suffix}:
$ echo "${string:${#prefix}:${#string}-${#prefix}-${#suffix}}"
o-wor
使用=~操作符:
$ string="hello-world"
$ prefix="hell"
$ suffix="ld"
$ [[ "$string" =~ ^$prefix(.*)$suffix$ ]] && echo "${BASH_REMATCH[1]}"
o-wor
对阿德里安早餐满意:
function strip {
local STRING=${1#$"$2"}
echo ${STRING%$"$2"}
}
像这样使用它
HELLO=":hello:"
HELLO=$(strip "$HELLO" ":")
echo $HELLO # hello