url=http://www.foo.bar/file.ext; echo ${url##/*}
मुझे उम्मीद थी कि यह कोड प्रिंट होगा file.ext
, लेकिन यह पूरे URL को प्रिंट करता है। क्यों? मैं फ़ाइल नाम कैसे निकाल सकता हूँ?
dirname $url
। या grep -o 'http://[^/]*' <<<$url
।
url=http://www.foo.bar/file.ext; echo ${url##/*}
मुझे उम्मीद थी कि यह कोड प्रिंट होगा file.ext
, लेकिन यह पूरे URL को प्रिंट करता है। क्यों? मैं फ़ाइल नाम कैसे निकाल सकता हूँ?
dirname $url
। या grep -o 'http://[^/]*' <<<$url
।
जवाबों:
क्योंकि शब्द को छंटनी के लिए स्ट्रिंग से मेल खाना है। यह इस तरह दिखना चाहिए:
url="http://www.foo.bar/file.ext"; echo "${url##*/}"
धन्यवाद derobert, आपने मुझे सही दिशा में आगे बढ़ाया।
मैनपेज को उद्धृत करने के लिए:
${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, […]
/*
शुरुआत से मेल नहीं खाता, क्योंकि आपका URL h
नहीं से शुरू होता है /
।
एक तुच्छ तरीका है जिसे आप खोज रहे हैं (आपकी टिप्पणी के अनुसार) echo "$url" | rev | cut -d / -f 1 | rev
। लेकिन निश्चित रूप से, जो यूआरएल के स्लैश में समाप्त होने के लिए दिलचस्प परिणाम देगा।
एक और तरीका है कि आप जो चाहते हैं वह */
इसके बजाय पैटर्न का उपयोग करना हो सकता है ।
basename
(1) URL के साथ भी काम करता है, इसलिए आप बस कर सकते हैं:
url=http://www.foo.bar/file.ext; basename $url
इसे भी देखें: बैश विस्तारित ग्लोबिंग , हालांकि इस मामले में विस्तारित ग्लोब आवश्यक नहीं है।
shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}
आउटपुट: file.ext