使用 bash 从 URL 中提取基本文件名

使用 bash 从 URL 中提取基本文件名
url=http://www.foo.bar/file.ext; echo ${url##/*}

我预计这段代码会打印file.ext,但它打印了整个 URL。为什么?如何提取文件名?

答案1

因为单词必须与要修剪的字符串匹配。它应该看起来像:

$ url="http://www.foo.bar/file.ext"; echo "${url##*/}"
file.ext

谢谢德罗伯特,你引导我走向正确的方向。此外,正如 @frank-zdarsky 提到的,它basename位于 GNU coreutils 中,并且也应该在大多数平台上可用。

$ basename "http://www.foo.bar/file.ext"
file.ext

答案2

引用联机帮助页:

${parameter##word}
   Remove matching prefix pattern.  The word is expanded to produce
   a pattern just as in pathname expansion.  If the pattern matches
   the  beginning of the value of parameter, […]

/*与开头不匹配,因为您的 URL 以hnot开头/

做你正在寻找的事情的一个简单方法(根据你的评论)是echo "$url" | rev | cut -d / -f 1 | rev。当然,对于以斜线结尾的 URL,这会产生有趣的结果。

做你想做的事情的另一种方法可能是使用模式*/

答案3

basename(1) 也适用于 URL,因此您可以简单地执行以下操作:

url=http://www.foo.bar/file.ext; basename $url

答案4

也可以看看:Bash 扩展通配符,尽管在这种情况下扩展的 glob 不是必需的。

 shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}

输出:file.ext

相关内容