2010-03-24 169 views
1

我有一个类似sample.txt.pgp的字符串,我想在shell脚本中返回sample.txt(但是,字符串长度会有所不同,因此基本上是“.pgp”之前的所有字符)。是否有一个substr函数?就像,如果我做substr('sample.txt.pgp', -4, 0),它应该返回sample.txt?现在它不是,所以我想知道如果我的语法错了,或者substr不是函数?shell脚本中的Unix substr?

回答

2

您可以使用basename

$ basename sample.txt.pgp .pgp 
sample.txt 

使用反引号或$()把结果在一个变量,如果你想:

$ FILE=sample.txt.pgp 
$ VARIABLE=$(basename "$FILE" .pgp) 
$ echo $VARIABLE 
sample.txt 
+2

有趣的是,你使用'-s后缀'符号;这不是由POSIX标准化的;经典符号将是'$(basename $ file .pgp)'(假设名称保存在变量'$ file'中)。 – 2010-03-24 21:25:44

+1

@Jonathan是的!我刚刚在我的OS X机器上做了一个'man basename',并且看到了'-s'选项;它有点更灵活(可以处理多个字符串),我不知道它不是POSIX。我会编辑我的答案。 – 2010-03-24 21:40:00

+1

已编辑;我也放了一些双引号来支持文件名中的空格。 – 2010-03-24 21:41:59

0

filename sample.txt.pgp返回sample.txt,我相信。 (使用反引号)

+0

我不认为我看到这个命令安装在我的任何系统上... – Cascabel 2010-03-24 20:52:28

+1

@Jefromi:我认为他们指的是'basename'。 – 2010-03-24 21:02:25

+0

哎呀,是的。 basename – Cheeso 2010-03-24 21:23:13

3
a='sample.txt.pgp' 
echo ${a%.*} # sample.txt (minimal match) 
echo ${a%%.*} # sample  (maximal match) 
+0

这看起来很有趣......美元符号和%代表什么?你有一个网页有点解释这个或任何东西? – TwixxyKit 2010-03-24 20:59:00

+0

@KnockKnockWhosThere:请阅读http://www.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02了解更多信息。 :-) – 2010-03-24 21:00:44

+2

而一个更受限制的版本:'$ {a%.pgp}'只会删除一个'.pgp'扩展名(如果存在的话);原文将根本删除任何扩展名(这在某些情况下可能有用)。 – 2010-03-24 21:27:14