Извлеките базовое имя файла из URL, используя bash

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

Я ожидал, что этот код напечатает file.ext, но он печатает весь URL. Почему? Как я могу извлечь имя файла?

ManuelSchneid3r
источник
Хорошо, я ожидаю, что произойдут не те вещи. Ну, я хочу извлечь file.ext
ManuelSchneid3r
Вы пытаетесь обрезать конец строки? Попробуй dirname $url. Или grep -o 'http://[^/]*' <<<$url.
Кевин

Ответы:

27

Потому что слово должно соответствовать строке, которая будет обрезана. Это должно выглядеть так:

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

Спасибо, Дероберт, ты направил меня в правильном направлении.

ManuelSchneid3r
источник
Ха, мы оба понимаем это одновременно. Рад помочь.
Дероберт
10

Чтобы процитировать manpage:

${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, заканчивающихся косой чертой.

Другой способ сделать то, что вы хотите, это использовать шаблон */.

derobert
источник
Рад, что вы дали объяснение того, что нужно сделать, и цитата из справочника - огромный плюс! Это мне очень помогло! Еще раз спасибо! :)
Фади
5

basename(1) также работает с URL, так что вы можете просто сделать:

url=http://www.foo.bar/file.ext; basename $url
Фрэнк Здарский
источник
4

Смотрите также: Bash Extended Globbing , хотя в этом случае расширенный glob не является обязательным.

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

Выход: file.ext

Peter.O
источник