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?


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.


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


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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.