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


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

我希望可以打印此代码file.ext,但是它将打印整个URL。为什么?如何提取文件名?


好吧,我期待发生错误的事情。好吧,我想提取file.ext
ManuelSchneid3r

您要切断字符串的结尾吗?尝试dirname $url。或者grep -o 'http://[^/]*' <<<$url
凯文

Answers:


28

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

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

谢谢德罗伯特,您引导我朝着正确的方向前进。


嗯,我们都同时意识到这一点。很高兴有帮助。
derobert 2013年

10

引用手册页:

${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, […]

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

一种简单的方法(根据您的评论)来寻找您想要的东西echo "$url" | rev | cut -d / -f 1 | rev。但是,当然,对于以斜杠结尾的URL会给出有趣的结果。

进行所需操作的另一种方法可能是使用模式*/


很高兴您对需要做的事情进行了解释,联机帮助页上的引文是一个巨大的加号!那对我很有帮助!再次感谢!:)
Fadi

6

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

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

4

另请参阅:Bash扩展globbing,尽管在这种情况下扩展glob不是必需的。

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

输出: file.ext

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.