बैश: एक स्ट्रिंग के भीतर दो अलग-अलग तारों की नौवीं घटना के बीच सभी पात्रों को वापस करें


1

बैश स्क्रिप्ट में (Ubuntu 14.04 पर) मैं कमांड चला रहा हूं:

WP055="$(wget -qO - http://alerts.weather.gov/cap/wwaatmget.php?x=CAZ055&y=1)"

WP055 चर स्ट्रिंग के भीतर '& lt; शीर्षक & gt;' की एक अज्ञात संख्या होगी। और '& lt; / शीर्षक & gt;' जोड़े। मुझे इनमें से प्रत्येक जोड़े के लिए 'एनडब्ल्यूएस' द्वारा स्ट्रिंग के लिए खोज करने की आवश्यकता है, जिसका अर्थ है कि इस विशेष स्ट्रिंग में विशेष मौसम सलाहकार की शुरुआत और अंत का समय शामिल है। यह पाया गया स्ट्रिंग (ओपनिंग और क्लोजिंग टाइटल टैग के बीच के सभी अक्षर) वह है जिसे मैं दूसरे वेरिएबल में कैप्चर करना चाहता हूं ताकि मैं इसे एक index.html फ़ाइल में ड्रॉप कर सकूं।

मैं WP055 चर x के माध्यम से लूपिंग की योजना बना रहा था, जब तक कि मुझे सही एक न मिल पाने तक टैग की प्रत्येक जोड़ी के भीतर पाठ का विश्लेषण करना।

मैं 'NWS' द्वारा WP055 नहीं खोज सकता क्योंकि WP055 के भीतर एक से अधिक घटनाएँ हो सकती हैं (WP055 स्ट्रिंग के भीतर कई सलाह)।

(उपरोक्त wget कमांड में निश्चित रूप से 07 मार्च को अपराह्न 3:00 बजे पीएसटी में दूसरे शीर्षक जोड़े के भीतर 'NWS' स्ट्रिंग द्वारा होगा, जब वर्तमान पवन सलाहकार रद्द कर दिया जाएगा।)


वाह। बहुत बहुत धन्यवाद @ जी-मैन। मैं दो पूर्ण सप्ताहांत (और असफल) के लिए इस और स्ट्रिंग इंडेक्स के साथ संघर्ष कर रहा हूं। आपका समाधान इतना साफ है। मैं इसे आज रात और अगले सप्ताहांत में अपने कार्यक्रम में काम करूँगा। धन्यवाद।
wdavro

आपका स्वागत है। जैसा कि आप जानते हैं, सिस्टम ने मुझे सूचित किया कि आपने मेरा उत्तर स्वीकार कर लिया है, लेकिन इसने मुझे आपकी टिप्पणी (ऊपर) के लिए सचेत नहीं किया, भले ही आपने "@ जी-मैन" कहा हो। आप उस व्यक्ति को "पिंग" कर सकते हैं, जिस तरह से आप केवल उस पोस्ट पर टिप्पणी करते हैं जो उसने लिखा है, या उसकी एक टिप्पणी के तहत। इसलिए, यदि आप किसी ऐसे व्यक्ति से कुछ कहना चाहते हैं जिसने आपके प्रश्न का उत्तर दिया है, तो आपको उत्तर पर टिप्पणी करनी चाहिए।
G-Man

जवाबों:


0

थोड़ा अनप्लिट, लेकिन यह काम करने लगता है:

WP055="$(wget -qO - http://alerts.weather.gov/cap/wwaatmget.php?x=CAZ055&y=1)"
remainder=${WP055#*<title>}
if [ "$WP055" = "$remainder" ]
then
        echo "No title found"
        exit
fi
while true
do
        this_title=${remainder%%</title>*}
        if [ "$remainder" = "$this_title" ]
        then
                echo "</title> not found"
                exit
        fi
        if [[ "$this_title" == *"by NWS"* ]]
        then
                echo "$this_title contains \"by NWS\""
                # You probably want to do something here, like return.
        fi
        new_remainder=${remainder#*<title>}
        if [ "$new_remainder" = "$remainder" ]
        then
                echo "No more titles"
                exit
        fi
        remainder=$new_remainder
done

remainder=${WP055#*<title>} पैरामीटर विस्तार का एक रूप है जो मेल खाने वाले उपसर्ग पैटर्न को हटाता है। यहां, यह सेट करता है remainder सेवा मेरे

  • स्ट्रिंग में पहला शीर्षक ( के सिवा परिचयात्मक <title> ),
  • अनुगामी </title>, तथा
  • उसके बाद के सभी स्ट्रिंग (बाद के सभी शीर्षकों सहित)।

अगर "$WP055" = "$remainder", इसका मतलब है कि शेल नहीं मिला <title> स्ट्रिंग में।

this_title=${remainder%%</title>*} इसी तरह सेट करता है this_title होने के लिए $remainder तक लेकिन शामिल नहीं है सबसे पहला </title>

if [[ कुछ कुछ 1 == कुछ कुछ 2 ]] डबल कोष्ठक के साथ ( [[ … ]] ) और डबल बराबर साइन ( == ), एक पैटर्न मैच करता है। बाकी सब कुछ दोहराव है।

यह विकृत इनपुट पर अजीब तरह से व्यवहार कर सकता है; यानी, जहां पाठ <title> तथा </title> बारी-बारी से जोड़े में नहीं होते।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.