Answers:
首先,您应该明确想要的内容。如果您知道该字符串结尾.rtf
并且想要删除该字符串.rtf
,则可以使用var2=${var%.rtf}
。如果您不知道后缀是什么,但您想要从最后一个开始删除所有内容.
,可以使用var2=${var%.*}
。如果您只想使所有内容保持第一.
,则可以使用var2=${var%%.*}
。如果只有一个期间,则后两个选项具有相同的结果,但是如果可能有多个,则应该决定要哪个。
如果您确实要始终删除确切数目的字符,则可以使用以下选项。
您是专门指定bash的,所以我们将从bash内置函数开始。工作时间最长的是我上面使用的相同的后缀删除语法:要删除四个字符,请使用var2=${var%????}
。您需要为每个字符删除一个问号,因此对于较大的子字符串长度,这变得很麻烦。
较新的是子字符串提取:var2=${var::${#var}-4}
。您可以在此处用任意数字代替4
来删除不同数量的字符。(${#var}
替换为字符串的长度,因此实际上要求保留前(长度-4)个字符。)
较新的bash版本(特别是4+,这意味着MacOS附带的版本将无法使用)可以简化为just var2=${var::-4}
。
如果您实际上不是在使用bash,而是在使用其他POSIX类型的shell,那么即使在普通的旧破折号中(其余都不起作用),删除后缀仍然可以使用。在zsh中,它们都可以工作,但是您必须0
在冒号之间加一个:var2=${var:0:-4}
等。在ksh中,您需要0,还必须使用显式的length-4表达式:var2=${var:0:${#var}-4}
。
当然,您可以在实用程序的帮助下使用命令替换来完成此操作。有很多可以使用的方法,但var2=$(cut -c -4 <<<"$var")
可能是最短的选择。
您可以这样:
#!/bin/bash
v="some string.rtf"
v2=${v::-4}
echo "$v --> $v2"
bash
4+,但是在早期版本中,您可以使用稍长的时间${v::${#v}-4}
。
${v::-4}
“ zsh:预期中的大括号”。但是@fredtantini在下面的答案${v:0:-4}
很好用。
要从字符串末尾删除四个字符,请使用${var%????}
。
最终.
使用后要去除所有东西${var%.*}
。
${var#????}
。
对我有用的是:
echo "hello world" | rev | cut -c5- | rev
# hello w
但是我用它来修剪文件中的行,所以这看起来很尴尬。真正的用途是:
cat somefile | rev | cut -c5- | rev
cut
只能使您从某个起始位置开始进行修整,如果您需要可变长度的行,那么这是不好的。因此,此解决方案反转(rev
)字符串,现在我们将其与字符串的结束位置相关联,然后cut
按上述方式使用,并将其再次反转(再次rev
)回到其原始顺序。
rev
反转行,而不是字符串。echo $SOME_VAR | rev | ...
可能不会表现出人们的期望。
使用变量扩展/子字符串替换:
$ {var /%Pattern / Replacement}
如果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
或简单地 echo ${var::-4}
len=${#var}; echo ${var::len-4}
可以简化为echo ${var:0:-4}
:-)编辑:或正如@iyonizer所指出的,只是echo ${var::-4}
...
您可以使用sed,
sed 's/.\{4\}$//' <<< "$var"
例:
$ var="some string.rtf"
$ var1=$(sed 's/.\{4\}$//' <<< "$var")
$ echo $var1
some string
var2
?
我尝试了以下方法,它对我有用:
#! /bin/bash
var="hello.c"
length=${#var}
endindex=$(expr $length - 4)
echo ${var:0:$endindex}
输出: hel
希望以下示例对您有所帮助,
echo ${name:0:$((${#name}-10))}
-> ${name:start:len}
start
是字符串的起点len
是必须删除的字符串的长度。例:
read -p "Enter:" name
echo ${name:0:$((${#name}-10))}
输出:
Enter:Siddharth Murugan
Siddhar
注意:Bash 4.2添加了对负子字符串的支持