Bash में http लिंक का अंतिम भाग कैसे प्राप्त करें?


25

मेरे पास एक http लिंक है:

http://www.test.com/abc/def/efg/file.jar 

और मैं पिछले भाग file.jar को चर में सहेजना चाहता हूं, इसलिए आउटपुट स्ट्रिंग "file.jar" है।

शर्त : लिंक की लंबाई अलग हो सकती है जैसे:

http://www.test.com/abc/def/file.jar.

मैंने इसे इस तरह आज़माया:

awk -F'/' '{print $7}'

, लेकिन समस्या URL की लंबाई है, इसलिए मुझे एक कमांड की आवश्यकता है जिसका उपयोग किसी भी URL लंबाई के लिए किया जा सकता है।

जवाबों:


51

इसके लिए उपयोग awkकरना काम करेगा, लेकिन यह एक तरह का हिरण है जो हॉवित्जर के साथ शिकार करता है। यदि आपके पास पहले से ही आपका URL नंगे है, तो यह बहुत सरल है कि आप क्या चाहते हैं यदि आप इसे शेल चर में डालते हैं और bashअंतर्निहित पैरामीटर प्रतिस्थापन का उपयोग करते हैं:

$ myurl='http://www.example.com/long/path/to/example/file.ext'
$ echo ${myurl##*/}
file.ext

जिस तरह से यह काम एक उपसर्ग को हटाने के द्वारा होता है जो लालची '' / 'से मेल खाता है, जो कि ##ऑपरेटर करता है:

${haystack##needle} # removes any matching 'needle' from the
                    # beginning of the variable 'haystack'

उस के साथ जाने के लिए किसी भी तरह का स्पष्टीकरण?
प्रश्न

ज़रूर। कर लेंगे?
डोपघोटी

यह बहुत अच्छा है :)
प्रश्न

2
यदि आप क्वेरी स्ट्रिंग्स को स्ट्रिप करना चाहते हैं, तो आप पहले एक इंटरमीडिएट वैरिएबल को असाइन कर सकते हैं file=${myurl##*/}, उदाहरण के लिए , फिर वापस करने के लिए लालची रिवर्स-मैचिंग का उपयोग करें ?(इसे भागने के लिए मत भूलना!), जैसेecho ${file%%\?*}
डॉकटोर जे

21

basenameऔर dirnameURL के लिए भी अच्छा काम करें:

> url="http://www.test.com/abc/def/efg/file.jar"
> basename "$url"; basename -s .jar "$url"; dirname "$url"
file.jar
file
http://www.test.com/abc/def/efg

+1 शानदार, यह काम करता है क्योंकि एक URL और एक PATH और दोनों URI।
ट्यूलेंस कोरडोवा

1
@ TulainsCórdova एक पथ एक URI नहीं है ; इस काम करता है क्योंकि basenameऔर dirnameविभाजन तार पर /, और कहा कि यूआरएल के साथ काम करने के लिए बहुत लंबा के रूप में वे एक स्थानीय भाग (सामान्य हालांकि में यूआरआई के साथ नहीं) की जरूरत नहीं है के रूप में होता है, कम से कम।
स्टीफन किट

: यूआरआई के बारे में विकिपीडिया लेख में, वे URI सन्दर्भ के वैध उदाहरण के रूप में निम्नलिखित देना /relative/URI/with/absolute/path/to/resource.txt, relative/path/to/resource.txt, ../../../resource.txtऔर resource.txt en.wikipedia.org/wiki/...
Tulains Córdova

1
@ TulainsCórdova विकिपीडिया गलत नहीं है, /relative/pathया तो एक फाइल सिस्टम पथ या एक रिश्तेदार URI हो सकता है। लेकिन इनमें से कौन सा संदर्भ पर निर्भर करता है। जब इसे फ़ाइल सिस्टम पथ के रूप में उपयोग किया जाता है, तो यह URI नहीं है। जब इसे यूआरआई के रूप में उपयोग किया जाता है, तो यह फाइल सिस्टम पथ नहीं है। यह कहना सिर्फ एक यूआरआई है क्योंकि यह सिंटैक्स से मेल खाने के लिए होता है, जैसा कि इस टिप्पणी में प्रत्येक शब्द यूआरआई है।
एचवीडी

11

साथ awk, आप उपयोग कर सकते हैं $NFपिछले क्षेत्र पाने के लिए, फ़ील्ड की संख्या की परवाह किए बिना,:

awk -F / '{print $NF}'

यदि आप शेल स्ट्रिंग में उस स्ट्रिंग को स्टोर करते हैं, तो आप इसका उपयोग कर सकते हैं:

a=http://www.test.com/abc/def/efg/file.jar
printf '%s\n' "${a##*/}"

6

पोस्ट किए गए अधिकांश उत्तर URL पर मजबूत नहीं हैं जिनमें क्वेरी स्ट्रिंग या लक्ष्य होते हैं, जैसे कि, उदाहरण के लिए, निम्नलिखित:

https://example.com/this/is/a/path?query#target

पायथन में अपने मानक पुस्तकालय में URL पार्सिंग है; इसे करने देना आसान है। उदाहरण के लिए,

from urllib import parse
import sys
path = parse.urlparse(sys.stdin.read().strip()).path
print("/" if not path or path == "/" else path.rsplit("/", 1)[-1])

आप python3 -cशेल स्क्रिप्ट में उपयोग के लिए इसे एक ही में कॉम्पैक्ट कर सकते हैं :

echo 'https://example.com/this/is/a/path/componets?query#target' \
    | python3 -c 'from urllib import parse; import sys; path = parse.urlparse(sys.stdin.read().strip()).path; print("/" if not path or path == "/" else path.rsplit("/", 1)[-1])'

(आप पठनीयता के लिए भी स्क्रिप्ट को तोड़- 'मरोड़ कर रख सकते हैं, इससे आपको नई सुर्खियाँ मिलेंगी।)

बेशक, अब आपकी शेल स्क्रिप्ट में पायथन पर निर्भरता है।

(यदि मैं उन मामलों के बारे में थोड़ा अनिश्चित हूं जो उन मामलों को संभालने की कोशिश करते हैं जहां URL का पथ घटक मूल है ( /); समायोजित करें / परीक्षण करें यदि आपके लिए यह मायने रखता है।)


1

एक विधि revURL की है और फिर फ़ील्ड को फिर revसे काटें । उदाहरण के लिए:

echo 'http://www.test.com/abc/def/efg/file.jar ' | rev | cut -d '/' -f 1 | rev

आउटपुट:

file.jar 

उदाहरण 2:

echo 'http://www.test.com/abc/cscsc/sccsc/def/efg/file.jar ' | rev | cut -d '/' -f 1 | rev

आउटपुट:

file.jar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.