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


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

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


Хорошо, я ожидаю, что произойдут не те вещи. Ну, я хочу извлечь file.ext
ManuelSchneid3r

Вы пытаетесь обрезать конец строки? Попробуй dirname $url. Или grep -o 'http://[^/]*' <<<$url.
Кевин

Ответы:


27

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

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

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


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

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

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


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


4

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

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

Выход: file.ext

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.