bash: एक चरण में कई स्ट्रिंग जोड़तोड़ (पैरामीटर विस्तार) का उपयोग कैसे करें?
मेरे पास string=substr1-substr2-substr3.substr4
वह स्थान है जहाँ पर पदार्थ परिवर्तनशील लंबाई के होते हैं। मैं substr3
से और स्ट्रिंग हेरफेर विस्तार string
का उपयोग कर इसे निकालने के बारे में सोच रहा हूं । इस दृष्टिकोण का उपयोग करना, यह स्पष्ट है कि मुझे परिणामस्वरूप विस्तार, या इसके विपरीत चलाने और चलाने की आवश्यकता है । मेरे प्रश्न हैं:${string##pattern}
${string%pattern}
${string##*-}
${string%.*}
- क्या यह सबसे अच्छा विकल्प है?
- यदि हाँ, तो मैं एक कदम में दोनों कैसे चलाऊँ? जब मैं ऐसा कुछ करने की कोशिश करता हूं
${string##*-${string%.*}}
या${string%.*${string##*-}}
मैं पूरी तरह से वापस आ जाता हूं। मुझे लगता है कि मैं हमेशा पहले चरण के परिणाम के लिए एक मध्यवर्ती चर असाइन करके दो चरणों में निष्कर्षण कर सकता था, और फिर उस में हेरफेर कर सकता हूं; लेकिन मैं इसे एक चरण में करना चाहता हूं। मैं इसकी शुरुआत कैसे करूं?
टीआईए!
जवाब
दिया हुआ
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
।