Trích xuất tên tệp cơ sở từ một URL bằng cách sử dụng bash


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

Tôi dự kiến ​​mã này sẽ in file.ext, nhưng nó in toàn bộ URL. Tại sao? Làm thế nào tôi có thể trích xuất tên tập tin?


Được rồi obv Tôi đang mong đợi những điều sai trái sẽ xảy ra. Vâng, tôi muốn giải nén file.ext
ManuelSchneid3r

Bạn đang cố gắng để cắt kết thúc chuỗi? Hãy thử dirname $url. Hoặc grep -o 'http://[^/]*' <<<$url.
Kevin

Câu trả lời:


26

Bởi vì từ phải phù hợp với chuỗi được cắt. Nó sẽ trông giống như:

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

Cảm ơn derobert, bạn đã lái tôi đi đúng hướng.


Hah, cả hai chúng tôi nhận ra rằng cùng một lúc. Vinh dự khi được giup bạn.
derobert

10

Để trích dẫn trang chủ:

${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, […]

/*không khớp với từ đầu, vì URL của bạn bắt đầu hkhông /.

Một cách tầm thường để làm những gì bạn đang tìm kiếm (theo nhận xét của bạn) là echo "$url" | rev | cut -d / -f 1 | rev. Nhưng tất nhiên, điều đó sẽ mang lại kết quả thú vị cho các URL kết thúc bằng dấu gạch chéo.

Một cách khác để làm những gì bạn muốn có thể là sử dụng mô hình */thay thế.


Vui mừng bạn đã đưa ra một lời giải thích về những gì cần phải được thực hiện và trích dẫn từ trang chủ là một điểm cộng rất lớn! Điều đó đã giúp tôi rất nhiều! Cảm ơn một lần nữa! :)
Fadi

5

basename(1) cũng hoạt động với URL, vì vậy bạn chỉ cần làm:

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

4

Xem thêm: Bash Extended Globbing , mặc dù trong trường hợp này, toàn cầu mở rộng là không cần thiết.

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

Đầu ra: file.ext

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.