यदि लिंक हेडर में 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 और पैरामीटर विस्तार के साथ खेला गया - ऐसा नहीं है कि अनुभवी इसलिए अटक गया :)
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"
के बारे में सुनिश्चित करें।
आईएचटीएच
खैर - मैंने आपकी एक यूआरएल स्ट्रिंग को टेक्स्ट फाइल में डाल दिया और दो कटों के साथ पहले यूआरएल को बाहर निकालने में सक्षम था।
[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 #) बदल सकते हैं और देख सकते हैं कि आपको क्या मिलता है :)
संबंधित सवाल
नए सवाल
shell
'शेल' शब्द का अर्थ सामान्य रूप से टेक्स्ट-आधारित इंटरएक्टिव कमांड दुभाषियों के एक सामान्य वर्ग से है, जो अक्सर यूनिक्स और लिनक्स ऑपरेटिंग सिस्टम से जुड़ा होता है। शेल स्क्रिप्टिंग के बारे में प्रश्नों के लिए, कृपया 'बैश', 'पॉवरशेल' या 'क्श' जैसे अधिक विशिष्ट टैग का उपयोग करें। एक विशिष्ट टैग के बिना, एक पोर्टेबल (POSIX- आज्ञाकारी) समाधान ग्रहण किया जाना चाहिए, हालांकि इसके अलावा 'श्लोक' या 'श' का उपयोग करना बेहतर है।