我有一个变量var在Bash脚本中持有一个字符串:
echo $var
"some string.rtf"
我想删除这个字符串的最后四个字符,并将结果分配给一个新变量var2,以便
echo $var2
"some string"
我该怎么做呢?
我有一个变量var在Bash脚本中持有一个字符串:
echo $var
"some string.rtf"
我想删除这个字符串的最后四个字符,并将结果分配给一个新变量var2,以便
echo $var2
"some string"
我该怎么做呢?
当前回答
我尝试了以下方法,对我很有效:
#! /bin/bash
var="hello.c"
length=${#var}
endindex=$(expr $length - 4)
echo ${var:0:$endindex}
输出:冥界
其他回答
你可以用sed,
sed 's/.\{4\}$//' <<< "$var"
例子:
$ var="some string.rtf"
$ var1=$(sed 's/.\{4\}$//' <<< "$var")
$ echo $var1
some string
你可以这样做(在bash v4和更高版本中):
#!/bin/bash
v="some string.rtf"
v2=${v::-4}
echo "$v --> $v2"
注意:macos使用bash 3。默认为X
这也可以做到:
... | head -c -1
-c, --bytes=[-]NUM
print the first NUM bytes of each file; with the leading '-', print all but the last NUM bytes of each file
对我有用的是:
echo "hello world" | rev | cut -c5- | rev
# hello w
但我用它来修剪文件中的行,这就是为什么它看起来很尴尬。真正的用途是:
cat somefile | rev | cut -c5- | rev
切割只能让你从某个起始位置开始修剪,如果你需要可变长度的行,这是很糟糕的。因此,这个解决方案反转(rev)字符串,现在我们与它的结束位置相关,然后使用前面提到的cut,并将它反转(再次,rev)回其原始顺序。
上面的答案不适合我,因为mac os x附带了不同版本的bash。
我像这样使用sed:
var2=`echo $var2 | sed 's/.$//'`
删除最后一个字符
var2=`echo $var2 | sed 's/..$//'`
删除最后2个字符。