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?
dirname $url
. Hoặc grep -o 'http://[^/]*' <<<$url
.
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?
dirname $url
. Hoặc grep -o 'http://[^/]*' <<<$url
.
Câu trả lời:
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.
Để 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 h
khô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ế.
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
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