यदि लिंक हेडर में rel=next है तो अगला लिंक ढूंढें। लिंक हेडर प्राप्त करने से विभिन्न स्ट्रिंग्स हो सकती हैं। मुझे अगला लिंक खोजने की आवश्यकता है। जैसे

Link: <http://mygithub.com/api/v3/organizations/20/repos?page=1>; rel=prev, <http://mygithub.com/api/v3/organizations/20/repos?page=3>; rel=next, <http://mygithub.com/api/v3/organizations/20/repos?page=4>; rel=last, <http://mygithub.com/api/v3/organizations/20/repos?page=1>;

होगा http://mygithub.com/api/v3/organizations/ 20/repos?पेज=3

Link: <http://mygithub.com/api/v3/organizations/4/repos?page=2>; rel="next", <http://mygithub.com/api/v3/organizations/4/repos?page=2>; rel="last"

होगा http://mygithub.com/api/v3/organizations/ 4/repos?पेज=2

Sed और पैरामीटर विस्तार के साथ खेला गया - ऐसा नहीं है कि अनुभवी इसलिए अटक गया :)

0
klind 30 अक्टूबर 2020, 20:15

2 जवाब

सबसे बढ़िया उत्तर

कृपया ध्यान रखें कि HTML को गैर-एचटीएमएल टूल से पार्स करना जोखिम भरा है; आप देखेंगे कि यह काम करता है, और मान लें कि आप इससे हमेशा दूर हो सकते हैं। आप अगले स्तर की जटिलता को काम करने के लिए प्रयास करने में घंटों बिताएंगे, जब आपको अध्ययन करना चाहिए कि एचटीएमएल-जागरूक टूल का उपयोग कैसे करें। यह मत कहो कि हमने आपको चेतावनी नहीं दी (-;, लेकिन

printf "<http://mygithub.com/api/v3/organizations/20/repos?page=1>; rel=prev, <http://mygithub.com/api/v3/organizations/20/repos?page=3>; rel=next, <http://mygithub.com/api/v3/organizations/20/repos?page=4>; rel=last, <http://mygithub.com/api/v3/organizations/20/repos?page=1>;\n" \
| awk -F" " '{
    for(i=1;i<=NF;i++){
       if ($i == "rel=next,") {
         gsub(/[<>]/,"",$(i-1);sub(/;$/,"",$(i-1))
         print $(i-1)
       }
    }
}'

आवश्यक आउटपुट उत्पन्न करता है:

http://mygithub.com/api/v3/organizations/20/repos?page=3

स्क्रिप्ट सेक्शन के आउटपुट को वेरिएबल में सेव करने के लिए, आप कमांड-प्रतिस्थापन के लिए कोड रैप करते हैं, इस स्थिति में

 nextReposLink=$( printf .... | awk '....' )
 #-------------^^--------------------------^

^ पॉइंटेड आइटम कमांड-प्रतिस्थापन के लिए आधुनिक सिंटैक्स हैं। $( ... ) के अंदर का कोड निष्पादित किया जाता है और मानक आउटपुट को इनवोकिंग कमांड लाइन के तर्क के रूप में पारित किया जाता है। (कमांड प्रतिस्थापन के लिए मूल सिंटैक्स `cmds` है और साधारण मामले में भी यही काम करता है var=`cmds` । आप आधुनिक cmd-प्रतिस्थापन को आसानी से नेस्ट कर सकते हैं, जबकि पुराने संस्करण में बहुत अधिक आवश्यकता होती है भागने के चरित्र की फ़िडलिंग। यदि आप कर सकते हैं तो इससे बचें।

ध्यान दें कि किसी भी s/str/rep/ के बारे में जो sed कर सकता है, awk वही कर सकता है, लेकिन इसके लिए sub(/regx/, "repl", "str") या gsub(sameArgs) फ़ंक्शन के उपयोग की आवश्यकता होती है। इस विशेष मामले में, आपको <> जैसे \<\> से बचने की आवश्यकता हो सकती है।

हमेशा डीबीएल-उद्धरण चर के उपयोग, यानी echo "$nextReposLink" के बारे में सुनिश्चित करें।

आईएचटीएच

0
shellter 3 नवम्बर 2020, 06:43

खैर - मैंने आपकी एक यूआरएल स्ट्रिंग को टेक्स्ट फाइल में डाल दिया और दो कटों के साथ पहले यूआरएल को बाहर निकालने में सक्षम था।

[root@oelinux2 ~]# cat test
Link: <http://mygithub.com/api/v3/organizations/20/repos?page=1>; rel=prev, <http://mygithub.com/api/v3/organizations/20/repos?page=3>; rel=next, <http://mygithub.com/api/v3/organizations/20/repos?page=4>; rel=last, <http://mygithub.com/api/v3/organizations/20/repos?page=1>;

फिर कट का उपयोग करके:

cat test | cut -d "<" -f2 | cut -d ">" -f1


[root@oelinux2 ~]# cat test | cut -d "<" -f2 | cut -d ">" -f1
http://mygithub.com/api/v3/organizations/20/repos?page=1

यह एक विकल्प है - यदि आप स्ट्रिंग में पहला URL प्राप्त करना चाहते हैं। मूल रूप से - वह सिर्फ दो सीमांकक "<" और ">" के बीच क्या हथिया रहा है

कट के साथ: -d 'सीमांकक' है -f वह क्षेत्र है जिसे आप प्राप्त करना चाहते हैं।

यदि आप उस स्ट्रिंग में बाद का URL प्राप्त करना चाहते हैं, तो आप फ़ील्ड (-f #) बदल सकते हैं और देख सकते हैं कि आपको क्या मिलता है :)

0
Overcast 30 अक्टूबर 2020, 20:43