bash: एक चरण में कई स्ट्रिंग जोड़तोड़ (पैरामीटर विस्तार) का उपयोग कैसे करें?

Aug 15 2020

मेरे पास string=substr1-substr2-substr3.substr4वह स्थान है जहाँ पर पदार्थ परिवर्तनशील लंबाई के होते हैं। मैं substr3से और स्ट्रिंग हेरफेर विस्तार stringका उपयोग कर इसे निकालने के बारे में सोच रहा हूं । इस दृष्टिकोण का उपयोग करना, यह स्पष्ट है कि मुझे परिणामस्वरूप विस्तार, या इसके विपरीत चलाने और चलाने की आवश्यकता है । मेरे प्रश्न हैं:${string##pattern}${string%pattern}${string##*-}${string%.*}

  1. क्या यह सबसे अच्छा विकल्प है?
  2. यदि हाँ, तो मैं एक कदम में दोनों कैसे चलाऊँ? जब मैं ऐसा कुछ करने की कोशिश करता हूं ${string##*-${string%.*}}या ${string%.*${string##*-}}मैं पूरी तरह से वापस आ जाता हूं। मुझे लगता है कि मैं हमेशा पहले चरण के परिणाम के लिए एक मध्यवर्ती चर असाइन करके दो चरणों में निष्कर्षण कर सकता था, और फिर उस में हेरफेर कर सकता हूं; लेकिन मैं इसे एक चरण में करना चाहता हूं। मैं इसकी शुरुआत कैसे करूं?

टीआईए!

जवाब

2 ilkkachu Aug 15 2020 at 20:39

दिया हुआ

string=substr1-substr2-substr3.substr4

${string%.*} है

substr1-substr2-substr3

हां, ${string##*-${string%.*}}है

${string##*-substr1-substr2-substr3}

जिसका मतलब है कि शुरुआत से string, सब कुछ और सहित को दूर करना -substr1-substr2-substr3। लेकिन इसमें कोई विकल्प नहीं है string, क्योंकि सामने कोई डैश नहीं है substr1, इसलिए आपको मूल स्ट्रिंग मिलती है।

जो आप शायद चाहते हैं

string=substr1-substr2-substr3.substr4
result="${string%.*}" result="${result##*-}"

जिसके कारण resultगर्भपात हो जाता है substr3

Zsh में, आप इसे एक चरण में कर सकते हैं: लेकिन यह बाश में काम नहीं करता है।result=${${string%.*}##*-}

बैश में, आप #या के दाईं ओर विस्तार का उपयोग करने के लिए सीमित हैं %, और यह आपको यहाँ मदद नहीं करता है क्योंकि आपको स्ट्रिंग के प्रारंभ और अंत दोनों से भागों को निकालने की आवश्यकता है।


वैकल्पिक रूप से, यदि $stringनईलाइन वर्ण नहीं हैं, तो आप उपयोग कर सकते हैं

IFS=.- read -r a b c d <<< "$string"

और substr3से दूर पढ़ा c

उस स्थिति में, शेल और स्ट्रिंग के आकार के आधार पर, $stringवसीयत की सामग्री को एक अस्थायी फ़ाइल में संग्रहीत किया जाएगा या एक पाइप के माध्यम से खिलाया readजाएगा जो पहली पंक्ति को पढ़ेगा और इसके अनुसार विभाजित करेगा $IFS