【问题标题】: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#.} 相同,因为给定的模式仅匹配单个文字字符串。

标签: linux bash


【解决方案1】:

试试这个:

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

这将打印sh

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

echo ${x#*.}

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

【讨论】:

  • 谢谢,这行得通,但我不明白需要“*”。使用特殊字符时一定要使用吗?
  • Jahid 没有解释的是,他使用参数扩展/子字符串提取来解析行以删除路径中不需要的部分。 ## 从左边开始,然后匹配 所有出现的模式 *.(表示匹配所有内容直到最后一个 .)。 *任何字符出现零次或多次的通配符。单个# 匹配第一次出现的模式
  • 好吧,我唯一真正没有得到的是通配符部分。感谢您为我解决这个问题,我很感激。
猜你喜欢
  • 2014-06-08
  • 1970-01-01
  • 2014-07-25
  • 2011-11-24
  • 1970-01-01
  • 2021-04-20
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多