Ekstrak nama file dasar dari URL menggunakan bash

14
url=http://www.foo.bar/file.ext; echo ${url##/*}

Saya mengharapkan kode ini untuk dicetak file.ext, tetapi ia mencetak seluruh URL. Mengapa? Bagaimana saya bisa mengekstrak nama file?

ManuelSchneid3r
sumber
Oke, saya mengharapkan hal-hal yang salah terjadi. Yah saya ingin mengekstrak file.ext
ManuelSchneid3r
Anda mencoba memotong ujung talinya? Coba dirname $url. Atau grep -o 'http://[^/]*' <<<$url.
Kevin

Jawaban:

27

Karena kata harus cocok dengan string yang harus dipangkas. Seharusnya terlihat seperti:

url="http://www.foo.bar/file.ext"; echo "${url##*/}"

Terima kasih derobert, Anda mengarahkan saya ke arah yang benar.

ManuelSchneid3r
sumber
Hah, kami sama-sama menyadari hal itu. Senang bisa membantu.
derobert
10

Mengutip halaman 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, […]

/*tidak cocok dengan awal, karena URL Anda dimulai dengan htidak /.

Cara sepele untuk melakukan apa yang Anda cari (sesuai komentar Anda) adalah echo "$url" | rev | cut -d / -f 1 | rev. Tapi tentu saja, itu akan memberikan hasil yang menarik untuk URL yang diakhiri dengan garis miring.

Cara lain untuk melakukan apa yang Anda inginkan adalah menggunakan pola */.

derobert
sumber
Senang Anda memberi penjelasan tentang apa yang perlu dilakukan dan kutipan dari halaman manual adalah nilai tambah yang besar! Itu banyak membantu saya! Terima kasih lagi! :)
Fadi
5

basename(1) juga berfungsi dengan URL, sehingga Anda bisa melakukannya:

url=http://www.foo.bar/file.ext; basename $url
Frank Zdarsky
sumber
4

Lihat juga: Bash Extended Globbing , meskipun dalam hal ini glob yang luas tidak penting.

 shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}

Keluaran: file.ext

Peter.O
sumber