我知道如何删除文件的扩展名,当我知道它时:
nameis=$(basename $dataset .csv)
但是我想在不事先知道的情况下删除任何扩展名,有人知道怎么做吗?
任何帮助表示赞赏, 泰德
答案 0 :(得分:28)
在bash中,您可以执行以下操作:
nameis=${dataset%.*}
......例如:
$ dataset=foo.txt
$ nameis=${dataset%.*}
$ echo $nameis
foo
此语法在bash手册页中描述为:
$ {参数%字}
$ {参数%%字}
删除匹配的后缀模式。这个词被扩展为产生一个模式,就像路径名扩展一样。如果模式匹配参数展开值的尾部,那么展开的结果是具有最短匹配模式(“%”情况)或最长匹配模式(“%%”情况)的参数的扩展值)删除。如果参数是@或*,则模式删除操作依次应用于每个位置参数,并且扩展是结果列表。如果参数是使用@或*下标的数组变量,则模式删除操作依次应用于数组的每个成员,并且扩展是结果列表。
答案 1 :(得分:5)
现在,如果你想要一些时尚的老派regexp:
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克里斯蒂亚诺·萨维诺
答案 2 :(得分:1)
像${dataset%.*}
这样的东西可能会起作用;但要注意文件没有扩展名,因为它会寻找一个不属于切断扩展名的点。
答案 3 :(得分:1)
您可以使用sed
删除最后一个点后面的所有内容(如果有):
nameis=$(echo $filename | sed 's/\.[^.]*$//')
但是对于具有双重扩展名的文件,例如.tar.gz
。
答案 4 :(得分:1)
nameis = $ {数据集%%。*} 假设您的基本名称中没有一个点。这将从左侧返回尽可能长的无点字符串。
答案 5 :(得分:0)
我建议使用basename
使用sed
命令代替echo "$fileName" | sed 's/\..*$//g'
命令,如下所示:
{{1}}