url=http://www.foo.bar/file.ext; echo ${url##/*}
Esperaba que este código se imprimiera file.ext
, pero imprime la URL completa. ¿Por qué? ¿Cómo puedo extraer el nombre del archivo?
dirname $url
. O grep -o 'http://[^/]*' <<<$url
.
url=http://www.foo.bar/file.ext; echo ${url##/*}
Esperaba que este código se imprimiera file.ext
, pero imprime la URL completa. ¿Por qué? ¿Cómo puedo extraer el nombre del archivo?
dirname $url
. O grep -o 'http://[^/]*' <<<$url
.
Respuestas:
Porque la palabra tiene que coincidir con la cadena que se va a recortar. Debería verse así:
url="http://www.foo.bar/file.ext"; echo "${url##*/}"
Gracias Derobert, me guiaste en la dirección correcta.
Para citar la 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, […]
/*
no coincide con el comienzo, porque su URL comienza con h
no /
.
Una forma trivial de hacer lo que estás buscando (según tu comentario) es echo "$url" | rev | cut -d / -f 1 | rev
. Pero, por supuesto, eso dará resultados interesantes para las URL que terminan en una barra inclinada.
Otra forma de hacer lo que quieras podría ser usar el patrón en su */
lugar.
basename
(1) también funciona con URL, por lo que simplemente podría hacer:
url=http://www.foo.bar/file.ext; basename $url
Ver también: Bash Extended Globbing , aunque en este caso el glob extendido no es esencial.
shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}
Salida: file.ext