url=http://www.foo.bar/file.ext; echo ${url##/*}
Eu esperava que esse código file.ext
fosse impresso , mas ele imprime o URL inteiro. Por quê? Como posso extrair o nome do arquivo?
dirname $url
. Or grep -o 'http://[^/]*' <<<$url
.
url=http://www.foo.bar/file.ext; echo ${url##/*}
Eu esperava que esse código file.ext
fosse impresso , mas ele imprime o URL inteiro. Por quê? Como posso extrair o nome do arquivo?
dirname $url
. Or grep -o 'http://[^/]*' <<<$url
.
Respostas:
Porque a palavra precisa corresponder à string a ser aparada. Deve parecer com:
url="http://www.foo.bar/file.ext"; echo "${url##*/}"
Graças derobert, você me guiou na direção certa.
Para citar a página de manual:
${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, […]
/*
não corresponde ao início, porque seu URL começa com h
não /
.
Uma maneira trivial de fazer o que você está procurando (de acordo com o seu comentário) é echo "$url" | rev | cut -d / -f 1 | rev
. Mas é claro, isso dará resultados interessantes para URLs que terminam em uma barra.
Outra maneira de fazer o que você quer pode ser usar o padrão */
.
basename
(1) também funciona com URLs, então você pode simplesmente fazer:
url=http://www.foo.bar/file.ext; basename $url
Veja também: Bash Extended Globbing , embora neste caso o globo estendido não seja essencial.
shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}
Resultado: file.ext