আমি কীভাবে একটি অর্ধ এলোমেলো স্ট্রিং থেকে সম্পূর্ণ URL টি বের / পার্স করতে পারি?


12

আমি এলোমেলো সংক্ষিপ্ত স্ট্রিং থেকে বাশ পার্স / সম্পূর্ণ ইউআরএল (এবং কেবলমাত্র ইউআরএল) বের করতে চাই।

উদাহরণ:

bob, the address is http://www.google.com

অথবা

https://foo.com/category/example.html is up

অথবা

Error 123 occurred at http://bit.ly/~1223456677878

অথবা

Stats are up: https://foo1234.net/report.jpg

আমি ব্যবহার করার চেষ্টা করেছি cat foo_output | egrep -o "https?://[\w'-\.]*\s"কিন্তু এটি কাজ করে বলে মনে হচ্ছে না।


উত্তর:


24

তুমি কি চেষ্টা করেছিলে:

egrep -o 'https?://[^ ]+' foo_output

পরিবর্তে?

নোট করুন যে একটি অক্ষর শ্রেণীর সাথে যে কোনও কিছুই আক্ষরিক হিসাবে নেওয়া হয়, তাই বলা [\w]কোনও শব্দের সাথে মেলে না । তদ্ব্যতীত, আপনাকে কোনও অক্ষর শ্রেণীর মধ্যে একটি রেজেক্স মেটাক্রেটারকে পালাতে হবে না, অর্থাত্ ঠিক তেমনটি [\.]এক নয় [.]


2
[^ ]বেশী বিস্তৃত, আপনি অন্যান্য ঐ খালি বাদ দেওয়ার বিষয়ে পাবেন, (, ), সম্ভবত comas, এবং সমস্ত অক্ষর আছে যা URL গুলিতে অনুমতি দেওয়া হয়নি।
স্টাফেন চেজেলাস

পছন্দ করেছেন যাইহোক, আমি ধরে নিয়েছি যে ইউআরএলটি পূর্বের এবং লাইনের শেষ না হওয়া অবধি কোনও স্থান দ্বারা অনুসরণ এবং অনুসরণ করা হয়।
ডেভনুল

5

ইউআরআই প্রাকৃতিক ভাষায় এম্বেড করার সময় নিয়মিত এক্সপ্রেশন ম্যাচের জন্য উপযুক্ত নয়। যাইহোক, শিল্পের বর্তমান অবস্থা হ'ল জন গ্রুবারের উন্নত লিবারেল, মিলের ইউআরএলগুলির যথাযথ রেজেক্স প্যাটার্ন । বর্তমানে পোস্ট হিসাবে, এক-লাইন সংস্করণটি নীচে রয়েছে:

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))

জন একটি সারকথা বজায় রাখা মনে হচ্ছে এখানে , যদিও তার ব্লগে এন্ট্রি তার পরীক্ষা কর্পাস এবং রেগুলার এক্সপ্রেশন প্যাটার্ন সীমাবদ্ধতা ব্যাখ্যা অনেক ভালো পেশা আছে।

আপনি যদি কমান্ড লাইন থেকে অভিব্যক্তিটি বাস্তবায়ন করতে চান তবে আপনি যে নিয়মিত এক্সপ্রেশন ইঞ্জিন ব্যবহার করছেন তা দ্বারা বা শেল উদ্ধৃতি ইস্যু দ্বারা নিজেকে সীমাবদ্ধ দেখতে পারেন। আমি একটি রুবি স্ক্রিপ্টটি সেরা বিকল্প হিসাবে খুঁজে পেয়েছি তবে আপনার মাইলেজটি আলাদা হতে পারে।


2
দয়া করে এর সাথে যুক্ত হওয়ার পরিবর্তে আপনার উত্তরে রেজেক্সটি অন্তর্ভুক্ত করুন।
টেরডন

@ ইটারডন, সম্পূর্ণ রেজিপেক্সটি প্রায় 60 টি লাইন।
ভনব্র্যান্ড

2
@ ভনব্র্যান্ড আমি জানি, আমি এটি দেখেছি। আমরা কেবল বাহ্যিক সংস্থার সাথে সংযোগ এড়াতে ঝোঁক। এসই সাইটের পুরো পয়েন্টটি উইকি হতে হবে। আপনার লিঙ্ক করা ব্লগটি অফলাইনে চলে গেলে কী হবে? আপনার উত্তর অকেজো হয়ে যাবে। যাইহোক, 60 লাইনগুলি তেমন কিছু নয় এবং এটি পাঠযোগ্যতার জন্য কেবল 60 লাইন।
টেরডন

2

মিলে যাওয়া ইউআরএলগুলির সাথে সমস্যাটি হ'ল কোনও ইউআরএল-এ যে কোনও কিছু থাকতে পারে:

https://encrypted.google.com/search?hl=en&q=foo#hl=en&q=foo&tbs=qdr:w,sbd:1

যেহেতু আপনি দেখতে পারেন রয়েছে উপরে (বৈধ) URL টি $, ?, #, &, ,, .এবং :। মূলত, আপনি নিশ্চিত হতে পারবেন যে কোনও URL টি খালি নেই। এই বিষয়টি মাথায় রেখে আপনি আপনার ইউআরএলগুলি যতটা সাধারণ প্যাটার্ন দিয়ে সরিয়ে নিতে পারেন:

$ grep -oP 'http.?://\S+' file 
http://www.google.com
https://foo.com/category/example.html
http://bit.ly/~1223456677878
https://foo1234.net/report.jpg

\Sকোনো মিল অ-স্পেস Perl সামঞ্জস্যপূর্ণ রেগুলার এক্সপ্রেশনের (PCREs) এ অক্ষর, -Pজন্য PCREs সক্রিয় grepএবং -oএটা লাইনের শুধুমাত্র মিলেছে সেগমেন্ট প্রিন্ট করে তোলে।


0

আমি শৃঙ্খলার জন্য যেতে হবে তবে কিছুটা আলাদা। আপনার যদি স্ট্রিংস টেক্সট নামে একটি পাঠ্য ফাইলে আপনার মতো টেক্সট স্নিপেট থাকে তবে আপনি নীচের মতো করতে পারেন:

grep http ./strings.txt | sed 's/http/\nhttp/g' | grep ^http | sed 's/\(^http[^ <]*\)\(.*\)/\1/g' | grep IWANTthis | sort -u

ব্যাখ্যা:

grep http ./st3.txt      => will catch lines with http from text file
sed 's/http/\nhttp/g'    => will insert newline before each http
grep ^http               => will take only lines starting with http
sed 's/\(^http[^ <]*\)\(.*\)/\1/g'   
                         => will preserve string from ^http until first space or < (the latter in hope if 
grep IWANTthis           => will take only urls containing your text of your interest; you can omit this.
sort -u                  => will sort the list and remove duplicates from it 

ইউআরএলটি কাজ না করার সম্ভাবনা রয়েছে বলে আপনি আপনার আগ্রহের URL টি দিয়ে অতিরিক্ত ত্রুটিটি পরীক্ষা করতে পারেন। উদাহরণস্বরূপ wget -p URL -O /dev/null- URL টি উপলভ্য না হলে এটি বেশ আলাদা ত্রুটি কোডগুলি মুদ্রণ করবে, যাতে আপনি আপনার লিঙ্কগুলির তালিকা প্রক্রিয়া করতে এবং তাদের বৈধতার স্থিতি আউটপুট করতে একটি লুপ সেট আপ করতে পারেন।

আপনি যদি শেষ পর্যন্ত এইচটিএমএল ফাইলগুলি থেকে লিঙ্কগুলি সরিয়ে নিচ্ছেন তবে sedবিশেষ ক্ষেত্রে কিছুটা সমস্যা হতে পারে । যেহেতু এটি একটি মজাদার (পোস্ট) এ পরামর্শ দেওয়া হয়েছে যে আপনি সম্ভবত ইতিমধ্যে দেখেছেন - রিজেক্সপস না ব্যবহার করা তবে এইচটিএমএল পার্সার ইঞ্জিন ব্যবহার করা ভাল। এই জাতীয় সহজে উপলব্ধ পার্সার হ'ল পাঠ্য ব্রাউজারটি lynx(যে কোনও লিনাক্সে উপলব্ধ) on এটি আপনাকে তাত্ক্ষণিকভাবে একটি ফাইলে সমস্ত লিঙ্কের তালিকা ডাম্প করার অনুমতি দেয় এবং তারপরে আপনি কেবল গ্রেপ সহ আপনার পছন্দসই ইউআরএলগুলি বের করতে পারেন।

lynx -dump -listonly myhtmlfile.html | grep IWANTthisString | sort -u

তবে এটি লিঙ্কযুক্ত বেশিরভাগ ম্যাঙ্গেলড এইচটিএমএল ফাইল বা টেক্সট স্নিপেটে কাজ করবে না।


-1

মাত্র egrep -o 'https?://[^ ")]+'

যা অন্তর্ভুক্ত করবে url()এবং "HTTP"


3
এটি ডিভনুলের উত্তর থেকে কীভাবে আলাদা? আমি আশা করি আপনি বুঝতে পেরেছেন যে ব্যবহারটি egrepহ্রাস পেয়েছে।
অ্যান্থন

আপনার যদি বিদ্যমান উত্তরের তুলনায় উন্নতি হয় তবে আপনি সেই উত্তরটির নীচে "ভাগ করুন" লিঙ্কটির মাধ্যমে আবার উল্লেখ করতে পারেন। আরও দেখুন সহায়তা পৃষ্ঠা
জেফ স্ক্যালার হলেন

-1
cat text-file.txt | grep -Eo '(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'

সিএসভি ফাইলে এটি সংরক্ষণ করার জন্য বিকল্পভাবে এসইডি কমান্ড যুক্ত করুন:

| sed 's/;/<tab>/g' > file.csv
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.