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

echo $var
"some string.rtf"

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

echo $var2
"some string"

我该怎么做呢?


当前回答

对我有用的是:

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

但我用它来修剪文件中的行,这就是为什么它看起来很尴尬。真正的用途是:

cat somefile | rev | cut -c5- | rev

切割只能让你从某个起始位置开始修剪,如果你需要可变长度的行,这是很糟糕的。因此,这个解决方案反转(rev)字符串,现在我们与它的结束位置相关,然后使用前面提到的cut,并将它反转(再次,rev)回其原始顺序。

其他回答

你可以用sed,

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

例子:

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

对我有用的是:

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

但我用它来修剪文件中的行,这就是为什么它看起来很尴尬。真正的用途是:

cat somefile | rev | cut -c5- | rev

切割只能让你从某个起始位置开始修剪,如果你需要可变长度的行,这是很糟糕的。因此,这个解决方案反转(rev)字符串,现在我们与它的结束位置相关,然后使用前面提到的cut,并将它反转(再次,rev)回其原始顺序。

我尝试了以下方法,对我很有效:

#! /bin/bash

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

输出:冥界

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

例子:

basename -s .rtf "some string.rtf"

这将返回"some string"

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

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

输出“文件”

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

希望下面的例子能有所帮助,

echo ${名称:0:$((${#名称}-10 ))} --> ${ 名称:开始:len}

在上面的命令中,name是变量。 Start是字符串的起始点 Len是必须删除的字符串长度。

例子:

    read -p "Enter:" name
    echo ${name:0:$((${#name}-10))}

输出:

    Enter:Siddharth Murugan
    Siddhar

注意:Bash 4.2增加了对负子字符串的支持