我知道怎么删除文件的扩展名,当我知道它:去除文件扩展名不知道它
nameis=$(basename $dataset .csv)
,但我想删除任何分机不知道这一点,事前,任何人都知道如何做这个?
任何帮助表示赞赏, 特德
我知道怎么删除文件的扩展名,当我知道它:去除文件扩展名不知道它
nameis=$(basename $dataset .csv)
,但我想删除任何分机不知道这一点,事前,任何人都知道如何做这个?
任何帮助表示赞赏, 特德
在bash,你可以做到以下几点:
nameis=${dataset%.*}
...如:
$ dataset=foo.txt
$ nameis=${dataset%.*}
$ echo $nameis
foo
此语法在bash的手册页描述as:
$ {param ETER%字}
$ {参数%%字}
删除匹配的后缀模式。这个词被扩展为产生一个模式,就像路径名扩展一样。如果模式与参数扩展值的尾部相匹配,则扩展结果是具有最短匹配模式(“%”情况)或最长匹配模式(“%%”情况)已删除。如果参数是@或*,则模式删除操作将依次应用于每个位置参数,并且扩展是结果列表。如果参数是以@或*为下标的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展是结果列表。
像${dataset%.*}
可能工作;不过,请注意文件没有扩展名,因为它会查找不是要删除的扩展名的一部分。
你可以,如果任何最后的点以下除去一切,与sed
:
nameis=$(echo $filename | sed 's/\.[^.]*$//')
但是,这不会对文件具有双扩展名,如.tar.gz
工作。
我会建议,而不是basename
使用sed
命令,像这样:
echo "$fileName" | sed 's/\..*$//g'
nameis = $ {。数据集%% *} 假设你没有的基本名称有一个句点。这会从左侧返回尽可能长的无点串。现在
,如果你想要一些时尚的老学校正则表达式:
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
克里斯蒂亚诺萨维诺
感谢您的解释! – 2015-10-09 12:45:28
将为故障如果你想让结果成为'foo.bar',那么文件名就是'foo.bar.baz'。 – 2011-03-19 22:50:55
这对我来说非常好,因为我不希望文件名是'foo',不幸的是当目录中有一个点时,它就会失败。 – 2016-09-13 11:35:22