如何删除bash中字符串的最后n个字符?

How to remove last n characters from a string in Bash?

我在bash脚本中有一个变量var,其中包含一个字符串,比如:

1
2
echo $var
"some string.rtf"

我想删除这个字符串的最后4个字符,并将结果赋给一个新变量var2,以便

1
2
echo $var2
"some string"

我该怎么做?


您可以这样做:

1
2
3
4
5
6
7
#!/bin/bash

v="some string.rtf"

v2=${v::-4}

echo"$v --> $v2"


要从字符串末尾删除四个字符,请使用${var%????}

在最终的.之后,要移除所有东西,请使用${var%.*}


使用变量扩展/子字符串替换:

${var/%Pattern/Replacement}

If suffix of var matches Pattern, then substitute Replacement for Pattern.

所以你可以这样做:

1
2
~$ echo ${var/%????/}
some string

或者,

如果你总是有同样的4个字母

1
2
~$ echo ${var/.rtf/}
some string

如果总是以.xyz结尾:

1
2
~$ echo ${var%.*}
some string

您还可以使用字符串的长度:

1
2
3
~$ len=${#var}
~$ echo ${var::len-4}
some string

或者简单地说是echo ${var::-4}


对我有用的是:

1
2
echo"hello world" | rev | cut -c5- | rev
# hello w

但我用它来修剪文件中的线条,所以看起来很尴尬。真正的用途是:

1
cat somefile | rev | cut -c5- | rev

cut只能从某个起始位置进行修剪,如果需要可变长度的行,这是很糟糕的。因此,这个解将(rev字符串)反转,现在我们将其与结束位置联系起来,然后如前所述使用cut,然后将(rev字符串)反转回原来的顺序。


你可以用SED,

1
sed 's/.\{4\}$//' <<<"$var"

例子:

1
2
3
4
$ var="some string.rtf"
$ var1=$(sed 's/.\{4\}$//' <<<"$var")
$ echo $var1
some string


我尝试了以下方法,但效果很好:

1
2
3
4
5
6
#! /bin/bash

var="hello.c"
length=${#var}
endindex=$(expr $length - 4)
echo ${var:0:$endindex}

输出:hel


这对我来说是通过计算字符串的大小来实现的。很容易,你需要回显你需要返回的值,然后像下面那样存储它

1
2
3
4
5
6
7
removechars(){
        var="some string.rtf"
        size=${#var}
        echo ${var:0:size-4}  
    }
    removechars
    var2=$?

some string