url=http://www.foo.bar/file.ext; echo ${url##/*}
Я очікував, що цей код буде надрукований file.ext
, але він надрукує всю URL-адресу. Чому? Як я можу витягти ім'я файлу?
dirname $url
. Або grep -o 'http://[^/]*' <<<$url
.
url=http://www.foo.bar/file.ext; echo ${url##/*}
Я очікував, що цей код буде надрукований file.ext
, але він надрукує всю URL-адресу. Чому? Як я можу витягти ім'я файлу?
dirname $url
. Або grep -o 'http://[^/]*' <<<$url
.
Відповіді:
Тому що слово має відповідати рядку, який слід обрізати. Він повинен виглядати так:
url="http://www.foo.bar/file.ext"; echo "${url##*/}"
Спасибі Дероберте, ти направляв мене в правильному напрямку.
Процитуйте сторінку сторінки:
${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-адреса починається з h
не /
.
Тривіальний спосіб робити те, що ви шукаєте (відповідно до вашого коментаря) echo "$url" | rev | cut -d / -f 1 | rev
. Але, звичайно, це дасть цікаві результати для URL-адрес, що закінчуються косою рисою.
Ще одним способом зробити те, що ви хочете, може бути використання цього шаблону */
.
basename
(1) також працює з URL-адресами, так що ви можете просто зробити:
url=http://www.foo.bar/file.ext; basename $url
Дивіться також: Bash Extended Globbing , хоча в цьому випадку розширений глобус не є істотним.
shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}
Вихід: file.ext