删除除文件扩展名之外的所有内容[重复]

Posted

技术标签:

【中文标题】删除除文件扩展名之外的所有内容[重复]【英文标题】:Removing everything but filename extension [duplicate] 【发布时间】:2015-07-22 05:06:07 【问题描述】:

假设我有一个字符串:

x=file.tar.sh

我知道如何删除除最后 n 个字符之外的所有内容。像这样(删除除最后 3 个字符之外的所有内容:

$x: -3

但这不适用于具有不同后缀长度的文件。 (len .tar != len .sh)

我会通过删除直到最后一个点的所有内容来解决这个问题。我试过这个:

$x##.

这会删除最长的匹配,直到 "."但不知何故,它只是返回完整的字符串而不删除任何内容?

【问题讨论】:

你的分配错误应该是这个x=file.tar.sh 您似乎误解了$x##. 应该做什么。这只会删除一个前导句点,并且与$x#. 相同,因为给定的模式仅匹配单个文字字符串。 【参考方案1】:

试试这个:

x=file.tar.sh
echo $x##*.

这将打印sh

如果你想得到tar.sh,那么:

echo $x#*.

这里*匹配.出现之前的任何字符集

【讨论】:

谢谢,这行得通,但我不明白需要“*”。使用特殊字符时一定要使用吗? Jahid 没有解释的是,他使用参数扩展/子字符串提取来解析行以删除路径中不需要的部分。 ## 从左边开始,然后匹配 所有出现的模式 *.(表示匹配所有内容直到最后一个 .)。 *任何字符出现零次或多次的通配符。单个# 匹配第一次出现的模式 好吧,我唯一真正没有得到的是通配符部分。感谢您为我解决这个问题,我很感激。 @mythic linfo.org/wildcard.html

以上是关于删除除文件扩展名之外的所有内容[重复]的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 重定向除 css 和 javascript 之外的所有扩展

如何从文件名中删除除括号内容之外的所有内容

如何删除目录中除文件和目录列表之外的所有内容?

如何在循环中保存除一个变量之外的所有变量?

Linux Centos 删除除某(多)个文件之外的所有文件

Bash:如何删除所有带有扩展名的文件上的所有空行[重复]