2011-03-19 71 views
17

我知道怎么删除文件的扩展名,当我知道它:去除文件扩展名不知道它

nameis=$(basename $dataset .csv) 

,但我想删除任何分机不知道这一点,事前,任何人都知道如何做这个?

任何帮助表示赞赏, 特德

回答

27

在bash,你可以做到以下几点:

nameis=${dataset%.*} 

...如:

$ dataset=foo.txt 
$ nameis=${dataset%.*} 
$ echo $nameis 
foo 

此语法在bash的手册页描述as:

$ {param ETER%字}

$ {参数%%字}

删除匹配的后缀模式。这个词被扩展为产生一个模式,就像路径名扩展一样。如果模式与参数扩展值的尾部相匹配,则扩展结果是具有最短匹配模式(“%”情况)或最长匹配模式(“%%”情况)已删除。如果参数是@或*,则模式删除操作将依次应用于每个位置参数,并且扩展是结果列表。如果参数是以@或*为下标的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展是结果列表。

1

${dataset%.*}可能工作;不过,请注意文件没有扩展名,因为它会查找不是要删除的扩展名的一部分。

1

你可以,如果任何最后的点以下除去一切,与sed

nameis=$(echo $filename | sed 's/\.[^.]*$//') 

但是,这不会对文件具有双扩展名,如.tar.gz工作。

0

我会建议,而不是basename使用sed命令,像这样:

echo "$fileName" | sed 's/\..*$//g'

+0

将为故障如果你想让结果成为'foo.bar',那么文件名就是'foo.bar.baz'。 – 2011-03-19 22:50:55

+0

这对我来说非常好,因为我不希望文件名是'foo',不幸的是当目录中有一个点时,它就会失败。 – 2016-09-13 11:35:22

1

nameis = $ {。数据集%% *} 假设你没有的基本名称有一个句点。这会从左侧返回尽可能长的无点串。现在

5

,如果你想要一些时尚的老学校正则表达式:

echo "foo.bar.tar.gz" | sed "s/^\(.*\)\..*$/\1/" 

- >应返回:foo.bar.tar

 
I will break it down: 
s/ Substitute 
^  From the beginning 
\( Mark 
.*  Everything (greedy way) 
\)  Stop Marking (the string marked goes to buffer 1) 
\.  until a "." (which will be the last dot, because of the greedy selection) 
.*  select everything (this is the extension that will be discarded) 
$  until the end 
/ With (substitute) 
\1  The buffer 1 marked above (which is the filename before the last dot(.) 
/ End 

克里斯蒂亚诺萨维诺

+0

感谢您的解释! – 2015-10-09 12:45:28