我有一个变量var在Bash脚本中持有一个字符串:

echo $var
"some string.rtf"

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

echo $var2
"some string"

我该怎么做呢?


当前回答

上面的答案不适合我,因为mac os x附带了不同版本的bash。

我像这样使用sed:

var2=`echo $var2 | sed 's/.$//'`

删除最后一个字符

var2=`echo $var2 | sed 's/..$//'`

删除最后2个字符。

其他回答

你可以用sed,

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

例子:

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

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

去掉所有的东西,包括最后的。使用$ {var %。*}。

更多信息请参见Bash的参数展开文档。

你可以这样做(在bash v4和更高版本中):

#!/bin/bash

v="some string.rtf"

v2=${v::-4}

echo "$v --> $v2"

注意:macos使用bash 3。默认为X

在这种情况下,您可以使用basename,假设您在要删除的文件上有相同的后缀。

例子:

basename -s .rtf "some string.rtf"

这将返回"some string"

如果你不知道后缀,并希望它删除后面的所有内容,包括最后一个点:

f=file.whateverthisis
basename "${f%.*}"

输出“文件”

%表示切,。你砍的是*是通配符吗

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

$ {var / %模式/替代} 如果var的后缀匹配Pattern,则用Replacement替换Pattern。

所以你可以这样做:

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

另外,

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

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

如果它总是以。xyz结尾:

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

你也可以使用字符串的长度:

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

或者直接返回${var::-4}