2012-02-03 11 views
5

पर बैश स्ट्रिंग ऑपरेटरों को लागू करना मैं निरंतर स्ट्रिंग पर बैश स्ट्रिंग ऑपरेटरों का उपयोग करने का प्रयास कर रहा हूं। उदाहरण के लिए, आप चर $ foo पर निम्न कर सकते हैं:लगातार स्ट्रिंग

$ foo=a:b:c; echo ${foo##*:} 
c 

अब, अगर "एक: ख: ग":

echo ${"a:b:c"##*:} 
स्ट्रिंग स्थिर है, मैं की तरह एक अधिक संक्षिप्त समाधान करना चाहते हैं

हालांकि, यह मान्य बैश वाक्यविन्यास नहीं है। क्या ऐसा करने का कोई तरीका है?

[कारण मुझे यह करने की आवश्यकता है (प्रतिस्थापन के परिणाम को हार्डकोड करने की बजाय, यानी "सी" यहां) क्योंकि मेरे पास एक कमांड टेम्पलेट है जहां "% h" प्लेसहोल्डर को चलाने से पहले कुछ बदल दिया जाता है आदेश; प्रतिस्थापन का परिणाम

+1

यदि तार निरंतर डेलीमीटर के साथ सीमित हैं तो क्यों 'awk' या' sed' का उपयोग न करें? –

+0

हां, यह एक वैध विकल्प भी है, मैं इस बारे में उत्सुक था कि यह बैश स्ट्रिंग ऑपरेटरों के साथ कैसे किया जा सकता है, जो मेरी राय में थोड़ा अधिक सुरुचिपूर्ण है। – a3nm

उत्तर

4

पैरामीटर विस्तार का उपयोग संभव नहीं है यही कारण है कि।

आप इसके लिए अन्य आदेशों का उपयोग कर सकते हैं जैसे sed/awk/expr।

लेकिन मुझे इसके लिए आवश्यकता नहीं दिखाई दे रही है। तुम सिर्फ कर सकता है:

tmp=%h 
echo ${tmp##*:} 

या अगर गति एक मुद्दा नहीं है, और आपको अनावश्यक चर के साथ वर्तमान वातावरण को अस्त-व्यस्त नहीं करना चाहती: वैसे भी

(tmp=%h; echo ${tmp##*:}) 

, तो आप बेहतर होगा

# get third filed delimited by : 
$ cut -d: -f3<<<'a:b:c' 
c 

या awk की तरह और अधिक परिष्कृत या sed: स्ट्रिंग परिवर्तन करने के लिए आदेश टेम्पलेट का उपयोग कर या साधारण की तरह कटौती कुछ का उपयोग कर बंद

#get last field separated by ':' 
$ awk -F: '{print $NF}'<<<'a:b:c' 
c 
$ sed 's/.*:\([^:]*\)/\1/'<<<'a:b:c' 
c 

आपको जो चाहिए वह निर्भर करता है।

+0

'कट'-'awk'-'sed'-आधारित समाधानों को नापसंद करने का मेरा मुख्य कारण यह है कि वे थोड़ा अधिक हैं, और मध्यवर्ती चर के साथ समाधान को नापसंद करने का मेरा कारण यह है कि यह एक कमांड टेम्पलेट के लिए होगा प्रतिस्थापित और 'exec''d, अगर मैं एक चर परिभाषा जोड़ना चाहता हूं तो मुझे' bash -c' आमंत्रण में कमांड को लपेटने के लिए मजबूर कर रहा है। लेकिन ठीक है, अगर स्ट्रिंग ऑपरेटरों के साथ मेरा इरादा करने का कोई तरीका नहीं है, तो मैं बस कुछ और उपयोग कर सकता हूं। आपके उत्तर के लिए धन्यवाद! – a3nm

2

आप expr का प्रयोग कर एक समान परिणाम प्राप्त करने के सकता है बैश द्वारा एक निरंतर रूप में देखा जाता]:।

$ expr match "a:b:c" '.*:\(.*\)' 
c 
+0

कूल, मुझे इस उपयोगिता के बारे में पता नहीं था। – a3nm

1

आप बैश रेगुलर एक्सप्रेशन मिलान का उपयोग करने में सक्षम हो सकता है:

pattern='.*:([^:]+)$' 
[[ "a:b:c" =~ $pattern ]] 
echo "${BASH_REMATCH[1]}" 

लेकिन तुम क्यों एक चर काम में अपने टेम्पलेट प्रतिस्थापन नहीं कर सकते, तो पैरामीटर विस्तार में चर का उपयोग करें?

+0

उत्तर के लिए धन्यवाद! यदि संभव हो तो मैं इंटरमीडिएट वेरिएबल असाइनमेंट का उपयोग करने से बचने का कारण यह है कि कमांड को 'exec' पर पास किया जाता है, इसलिए एक परिवर्तनीय असाइनमेंट होने से मुझे इसे दूसरे शेल में लपेटने के लिए मजबूर किया जाता है।इसके अलावा, मुझे यह जानने के लिए उत्सुक था कि मध्यवर्ती varibale असाइनमेंट से बचा जा सकता है या नहीं। – a3nm

संबंधित मुद्दे