বাশ-এ http লিঙ্কের শেষ অংশটি কীভাবে পাবেন?


25

আমার একটি লিঙ্ক আছে:

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

এবং আমি শেষ অংশটি ফাইল.জারকে ভেরিয়েবলে সংরক্ষণ করতে চাই, সুতরাং আউটপুট স্ট্রিংটি "file.jar" হয়।

শর্ত : লিঙ্কের বিভিন্ন দৈর্ঘ্য থাকতে পারে যেমন:

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

আমি সেভাবে চেষ্টা করেছিলাম:

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

, তবে সমস্যাটি ইউআরএল-এর দৈর্ঘ্য, সুতরাং আমার একটি কমান্ড দরকার যা কোনও ইউআরএল দৈর্ঘ্যের জন্য ব্যবহার করা যেতে পারে।

উত্তর:


51

awkএটির জন্য ব্যবহার করা কার্যকর হবে তবে এটি হাওজিটারের সাথে এক প্রকার হরিণ শিকার। যদি আপনার ইতিমধ্যে আপনার ইউআরএল খালি থাকে তবে আপনি যদি এটি শেল ভেরিয়েবলের মধ্যে রাখেন এবং bashবিল্ট-ইন প্যারামিটার বিকল্প ব্যবহার করেন তবে আপনি যা চান তা করা খুব সহজ simple

$ 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এবং dirnameইউআরএল জন্য খুব ভাল কাজ:

> 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 এবং উভয়ই ইউআরআই।
তুলিনাস কর্ডোভা

1
@ টুলিনস কর্ডোভা কোনও পথটি ইউআরআই নয় ; এটি কাজ করে কারণ / basenameএবং dirnameবিভক্ত স্ট্রিংগুলি / এ, এবং এটি ইউআরএলগুলির সাথেও কাজ করে, যতক্ষণ না তাদের স্থানীয় অংশ না থাকে (সাধারণত ইউআরআই সহ নয়) with
স্টিফেন কিট

: URI উল্লিখিত সম্পর্কে উইকিপিডিয়ার নিবন্ধ, তারা কোনো URI রেফারেন্স বৈধ উদাহরণ হিসাবে নিম্নলিখিত দিতে /relative/URI/with/absolute/path/to/resource.txt, relative/path/to/resource.txt, ../../../resource.txtএবং resource.txt en.wikipedia.org/wiki/...
Tulains কর্ডোভা

1
@ টুলিনস কর্ডোভা উইকিপিডিয়া ভুল নয়, /relative/pathহয় ফাইল সিস্টেমের পথ বা কোনও সম্পর্কিত ইউআরআই হতে পারে। তবে এগুলির মধ্যে কোনটি নির্ভর করে প্রসঙ্গে। যখন এটি ফাইল সিস্টেমের পথ হিসাবে ব্যবহৃত হয়, এটি কোনও ইউআরআই নয়। এটি যখন ইউআরআই হিসাবে ব্যবহৃত হয়, এটি কোনও ফাইল সিস্টেমের পথ নয়। এটি একটি ইউআরআই বলা কেবল সিনট্যাক্সের সাথে মিলে যাওয়ার কারণ এটি এই মন্তব্যের প্রতিটি শব্দই ইউআরআই হিসাবে বলা।
এইচডিভি

11

এর সাথে awk, আপনি $NFক্ষেত্রের সংখ্যা নির্বিশেষে শেষ ক্ষেত্রটি পেতে, ব্যবহার করতে পারেন :

awk -F / '{print $NF}'

যদি আপনি সেই স্ট্রিংটি শেল ভেরিয়েবলে সঞ্চয় করেন তবে আপনি এটি ব্যবহার করতে পারেন:

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

6

বেশিরভাগ পোস্ট করা উত্তরগুলি ইউআরএলগুলিতে শক্ত নয় যা কোয়েরি স্ট্রিং বা লক্ষ্যগুলি ধারণ করে যেমন উদাহরণস্বরূপ, নিম্নলিখিত:

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

পাইথনের স্ট্যান্ডার্ড লাইব্রেরিতে ইউআরএল পার্সিং রয়েছে; এটি করতে দেওয়া এটি আরও সহজ। যেমন,

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])'

(পাঠযোগ্যতার জন্য আপনিও স্ক্রিপ্টটি বিচ্ছিন্ন রাখতে পারেন। ' new আপনাকে নতুন লাইনে letুকিয়ে দেবে))

অবশ্যই, এখন আপনার শেল স্ক্রিপ্টের পাইথনের উপর নির্ভরতা রয়েছে।

(আমি যদি URL এর পাথ উপাদান মূল ( /) মূল ক্ষেত্রে থাকে তবে এমন কেসগুলি হ্যান্ডেল করার চেষ্টা করে কিনা সে সম্পর্কে আমি কিছুটা অনিশ্চিত ;


1

একটি পদ্ধতি হল revইউআরএল এর পরে ক্ষেত্রটি কাটা এবং তারপরে 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.