url=http://www.foo.bar/file.ext; echo ${url##/*}
Mi aspettavo che questo codice venisse stampato file.ext
, ma stampa l'intero URL. Perché? Come posso estrarre il nome del file?
dirname $url
. Or grep -o 'http://[^/]*' <<<$url
.
url=http://www.foo.bar/file.ext; echo ${url##/*}
Mi aspettavo che questo codice venisse stampato file.ext
, ma stampa l'intero URL. Perché? Come posso estrarre il nome del file?
dirname $url
. Or grep -o 'http://[^/]*' <<<$url
.
Risposte:
Perché la parola deve corrispondere alla stringa da tagliare. Dovrebbe apparire come:
url="http://www.foo.bar/file.ext"; echo "${url##*/}"
Grazie Derobert, mi hai guidato nella giusta direzione.
Per citare la 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, […]
/*
non corrisponde all'inizio, perché il tuo URL inizia con h
non /
.
Un modo banale per fare ciò che stai cercando (secondo il tuo commento) è echo "$url" | rev | cut -d / -f 1 | rev
. Ma ovviamente, questo darà risultati interessanti per gli URL che terminano con una barra.
Un altro modo di fare quello che vuoi potrebbe essere */
invece usare il modello .
basename
(1) funziona anche con gli URL, quindi puoi semplicemente fare:
url=http://www.foo.bar/file.ext; basename $url
Vedi anche: Bash Extended Globbing , sebbene in questo caso il glob esteso non sia essenziale.
shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}
Produzione: file.ext