मैं एक अर्ध यादृच्छिक स्ट्रिंग से एक पूर्ण URL कैसे निकाल / पार्स कर सकता हूं?


12

मैं बेतरतीब शॉर्ट स्ट्रिंग से बैश पार्स / एक पूर्ण URL (और केवल url) निकालना चाहता / चाहती हूं।

उदाहरण:

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"लेकिन वह काम नहीं कर रहा था।


डरावना लगता है, इस बात पर निर्भर करता है कि आप निकाले गए URL के साथ क्या करना चाहते हैं ...
vonbrand

जवाबों:


24

क्या आप ने कोशिश की:

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

बजाय?

ध्यान दें कि चरित्र वर्ग के साथ कुछ भी शाब्दिक के रूप में लिया जाता है, इसलिए यह कहना [\w]एक शब्द चरित्र से मेल नहीं खाता है । इसके अलावा, आपको एक चरित्र वर्ग के भीतर एक रेगेक्स मेटाचैकर से बचने की आवश्यकता नहीं है, अर्थात, यह कहते हुए [\.]बिल्कुल समान नहीं है [.]


2
[^ ]बहुत चौड़ा है, तो आप अन्य रिक्त स्थान को बाहर करना चाहेंगे, (, ), संभवतः comas, और सभी पात्रों कि URL में स्वीकार्य नहीं कर रहे हैं।
स्टीफन चेजलस

@StephaneChazelas तुम सही हो। हालाँकि, मैंने यह मान लिया था कि URL पूर्ववर्ती है और पंक्ति के आरंभ या अंत में किसी स्थान के बाद आता है।
devnull

5

प्राकृतिक भाषा में एम्बेडेड होने पर नियमित अभिव्यक्ति के लिए URI अच्छी तरह से अनुकूल नहीं हैं। हालांकि, कला की वर्तमान स्थिति जॉन ग्रबेर के इम्प्रूव्ड लिबरल, मैचिंग यूआरएल के लिए सटीक रेगेक्स पैटर्न है । वर्तमान में पोस्ट की गई, एक-पंक्ति संस्करण इस प्रकार है:

(?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
कृपया इसे जोड़ने के बजाय अपने उत्तर में रेगेक्स शामिल करें।
terdon

@terdon, पूर्ण regexp कुछ 60 लाइनें है।
वॉनब्रांड

2
@vonbrand मुझे पता है, मैंने इसे देखा। हम सिर्फ बाहरी संसाधनों को जोड़ने से बचते हैं। एसई साइटों के पूरे बिंदु एक विकी होना है। क्या होगा यदि आप जिस ब्लॉग से जुड़े हैं वह ऑफ़लाइन हो? आपका जवाब बेकार हो जाएगा। वैसे भी, 60 लाइनें उतनी नहीं हैं और यह पठनीयता के लिए केवल 60 लाइनें हैं।
terdon

2

URL मिलान करने में समस्या यह है कि बस URL में कुछ भी हो सकता है:

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किसी भी मेल खाता है गैर अंतरिक्ष पर्ल संगत नियमित अभिव्यक्ति (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 

जैसा कि एक मौका है कि यूआरएल काम नहीं कर सकता है आप अपने यूआरएल ऑफ इंटरेस्ट के साथ अतिरिक्त त्रुटि जांच कर सकते हैं। जैसे wget -p URL -O /dev/null- URL उपलब्ध नहीं होने की स्थिति में यह काफी अलग-अलग त्रुटि कोड प्रिंट करेगा, इसलिए आप लिंक की अपनी सूची को संसाधित करने और उनकी वैधता स्थिति को आउटपुट करने के लिए एक लूप सेट कर सकते हैं।

यदि आप अंततः html फ़ाइलों से लिंक निकाल रहे हैं तो sedविशेष मामलों में कुछ परेशानी हो सकती है । जैसा कि यह एक मजाकिया (पोस्ट) में सुझाव दिया गया है जिसे आपने शायद पहले से ही देखा है - यह सबसे अच्छा हो सकता है कि रेगेक्स का उपयोग न करें लेकिन एक html पार्सर इंजन। ऐसा आसानी से उपलब्ध पार्सर पाठ केवल ब्राउज़र lynx(किसी भी लिनक्स पर उपलब्ध) है। यह आपको तुरंत एक फ़ाइल में सभी लिंक की सूची को डंप करने की अनुमति देता है और फिर आप बस उस यूआरएल को निकालते हैं जिसे आप grep के साथ चाहते हैं।

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

हालांकि यह लिंक के साथ ज्यादातर मैंगल्ड html फाइल या टेक्स्ट स्निपेट पर काम नहीं करेगा।


-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\+&@#/%=~_|]'

वैकल्पिक रूप से इसे CSV फ़ाइल में संग्रहीत करने के लिए SED कमांड जोड़ें:

| sed 's/;/<tab>/g' > file.csv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.