url=http://www.foo.bar/file.ext; echo ${url##/*}
Je m'attendais à ce que ce code s'imprime file.ext
, mais il imprime l'URL entière. Pourquoi? Comment extraire le nom du fichier?
dirname $url
. Ou grep -o 'http://[^/]*' <<<$url
.
url=http://www.foo.bar/file.ext; echo ${url##/*}
Je m'attendais à ce que ce code s'imprime file.ext
, mais il imprime l'URL entière. Pourquoi? Comment extraire le nom du fichier?
dirname $url
. Ou grep -o 'http://[^/]*' <<<$url
.
Réponses:
Parce que le mot doit correspondre à la chaîne à couper. Cela devrait ressembler à:
url="http://www.foo.bar/file.ext"; echo "${url##*/}"
Merci derobert, vous m'avez dirigé dans la bonne direction.
Pour citer la page de manuel:
${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, […]
/*
ne correspond pas au début, car votre URL commence par h
non /
.
Une façon triviale de faire ce que vous cherchez (selon votre commentaire) est echo "$url" | rev | cut -d / -f 1 | rev
. Mais bien sûr, cela donnera des résultats intéressants pour les URL se terminant par une barre oblique.
Une autre façon de faire ce que vous voulez peut être d'utiliser le modèle à la */
place.
basename
(1) fonctionne également avec les URL, vous pouvez donc simplement faire:
url=http://www.foo.bar/file.ext; basename $url
Voir aussi: Bash Extended Globbing , bien que dans ce cas le glob étendu ne soit pas essentiel.
shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}
Production: file.ext