在不知道的情况下从文件中删除扩展

时间:2011-03-19 21:39:59

标签: bash

我知道如何删除文件的扩展名,当我知道它时:

nameis=$(basename $dataset .csv)

但是我想在不事先知道的情况下删除任何扩展名,有人知道怎么做吗?

任何帮助表示赞赏, 泰德

6 个答案:

答案 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}}