Estrai il nome del file di base da un URL usando bash


14
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?


Va bene, mi aspetto che succedano cose sbagliate. Bene, voglio estrarre file.ext
ManuelSchneid3r,

Stai cercando di tagliare l'estremità della corda? Prova dirname $url. Or grep -o 'http://[^/]*' <<<$url.
Kevin,

Risposte:


27

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.


Ah, lo capiamo entrambi allo stesso tempo. Felice di essere di aiuto.
derobert,

10

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 hnon /.

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 .


Sono contento che tu abbia dato una spiegazione di ciò che deve essere fatto e la citazione dalla manpage è un grande vantaggio! Questo mi ha aiutato molto! Grazie ancora! :)
Fadi,

5

basename(1) funziona anche con gli URL, quindi puoi semplicemente fare:

url=http://www.foo.bar/file.ext; basename $url

4

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.