क्या चर प्रतिस्थापन में कमांड प्रतिस्थापन हो सकता है?


10

मैं एक विशेष स्ट्रिंग पर चर प्रतिस्थापन का उपयोग करना चाहूंगा जिसे मैं एक कमांड के माध्यम से एक्सेस करता हूं। उदाहरण के लिए, यदि मैं अपने क्लिपबोर्ड में कुछ कॉपी करता हूं, तो मैं इसे इस तरह एक्सेस कर सकता हूं।

$ xclip -o -selection clipboard
Here's a string I just copied.

अगर मैं इसे किसी वैरिएबल को असाइन करता हूं, तो मैं इस पर वैरिएबल प्रतिस्थापन कर सकता हूं।

$ var=$(xclip -o -selection clipboard)
$ echo $var
Here's a string I just copied.
$ echo ${var/copi/knott}
Here's a string I just knotted.

हालांकि, चर को असाइन किए बिना चर प्रतिस्थापन करने का एक तरीका है? वैचारिक रूप से, कुछ इस तरह।

$ echo ${$(xclip -o -selection clipboard)/copi/knott}
bash: ${$(xclip -o -selection clipboard)/copi/knott}: bad substitution

यह सिंटैक्स विफल हो जाता है, क्योंकि varएक चर नाम होना चाहिए, न कि एक स्ट्रिंग।

जवाबों:


6

नहीं, आप नहीं कर सकते। bashऔर अधिकांश अन्य गोले (को छोड़कर zsh) नेस्टेड प्रतिस्थापन की अनुमति नहीं देते हैं।

के साथ zsh, आप नेस्टेड प्रतिस्थापन कर सकते हैं :

$ echo ${$(echo 123)/123/456}   
456

मैं इस उत्तर को स्वीकार करूंगा, क्योंकि यह कुछ परिस्थितिजन्य साक्ष्य प्रदान करता है जो इसमें संभव नहीं है bash। (और मुझे फिर से पलायन करने की ओर धकेलता है zsh।)
११:१३

2

हाँ, आप ऐसा कर सकते हैं। यह वास्तव में सुंदर नहीं है। यह नेस्टेड की तुलना में इन-लाइन की तरह अधिक है । समस्या यह है कि आपके द्वारा विस्तारित पैरामीटर के मूल्य पर काम करना है - यदि उस पैरामीटर का कोई मूल्य नहीं है, तो आप बहुत कुछ नहीं करेंगे। तो, आप इसे विस्तारित करते समय मान असाइन कर सकते हैं और यह शायद ही कोई शॉर्टकट है।

v=; echo "${v:=${0##*["$0${v:=$(xsel -bo)}"]}${v/copi/knott}}"

मैं असाइनमेंट छिपाने के $0लिए चेन के भीतर परम विस्तार का उपयोग करता हूं । यह नेस्टेड असाइनमेंट विस्तार के भीतर var के मान को असाइन करता है। बाहरी मिसाल कायम करता है - लेकिन क्योंकि यह जो कुछ भी आंतरिक को बताता है उसका विस्तार करना मुश्किल है। हालांकि, अगर हम आंतरिक विस्तार को चुप करते हैं, तो इसे संशोधित करें आप जो चाहें प्राप्त कर सकते हैं। अपने स्ट्रिंग को मेरे क्लिपबोर्ड पर कॉपी करने के बाद (मेरे पास नहीं है - बस ) यह प्रिंट करता है:xclipxsel

Here's a string I just knotted.

यह थोड़ा स्पष्ट है कि क्या हो रहा है यदि आप $0बाहर निकल जाते हैं, हालांकि:

v=; echo "${v:=${v:=$(xsel -bo)}${v/copi/knott}}"

वह प्रिंट:

Here's a string I just copied.  Here's a string I just knotted.

... क्योंकि आंतरिक असाइनमेंट संशोधन से पहले होता है, लेकिन, जैसा कि उल्लेख किया गया है, बाहरी असाइनमेंट पूर्वता लेता है - और यह आंतरिक-असाइनमेंट के विस्तार और संशोधित आंतरिक-विस्तार दोनों तक फैलता है ।

बेशक, इनमें से कोई भी काम नहीं करता है यदि लक्षित पैरामीटर पहले से ही असाइन किया गया है - तो आप केवल यह निश्चित रूप से कर सकते हैं यदि आप पहली जगह में चर को खाली करते हैं ... जो, ईमानदारी से, संभवतः यह सब के बाद इसे असाइन करने का सबसे सुविधाजनक समय है ।


वर्कअराउंड के लिए +1, हालाँकि जैसा कि आप कहते हैं, यह एक वर्कअराउंड है जो शायद एक वेरिएबल असाइन करने से भी बदतर है!
११:११

@ श्रावक - हाँ, निश्चित रूप से बदतर। और वास्तव में कुछ भी गलत नहीं है w / वैसे भी - अनिश्चितता के अलावा बहुत कुछ हासिल करने के लिए नहीं है। आप aliasइसे थोड़ा और सुविधाजनक बनाने के लिए कुछ अप्रत्यक्ष के साथ आ सकते हैं - लेकिन अगर इसके लायक आप के लिए है तो आपको सुरक्षित-उद्धरण से निपटने और कुछ w / evalया कुछ भी ऐसा करने के लिए फ़ंक्शन सेट करना चाहिए । w / eval- यदि आप कमांड उप की आउटपुट राशि के पहले चार्ट को काम करने योग्य विस्तार सिंटैक्स में बना सकते हैं - तो आप शायद बहुत आगे बहुत आसान प्राप्त कर सकते हैं। मुझे पता है कि इस तरह की बात आसान होगी w / xsel- यह अड़चन लगती है - लेकिन xsel?
मिकसेर

@ शेपर्क - मुझे पता है कि किसी भी तरह से कैसे करना है, क्योंकि कुछ स्थितियों में यह उपयोगी हो सकता है - जैसे कि शीघ्र या यहाँ-डॉक्टर विस्तार - जिसमें आपको अन्यथा आवेदन करने के लिए एक वर्तमान शेल असाइनमेंट नहीं मिल सकता है।
मिकसेर

1

यदि आप एक वैरिएबल नहीं बनाना चाहते हैं, तो स्ट्रिंग प्रतिस्थापन करने के अन्य तरीके हैं:

$ echo $(xclip -o -selection clipboard | sed 's/copi/knott/')
Here's a string I just knotted.

धन्यवाद, मुझे पता था कि मैं sedइसके बजाय उपयोग कर सकता हूं , लेकिन यह एक सामान्य प्रश्न से अधिक था, प्रतिस्थापन के घोंसले के शिकार पर।
स्पार्कहॉक

@Sparhawk मेरी जानकारी के लिए, कोई एक चर होने के बिना परिवर्तनीय प्रतिस्थापन नहीं कर सकता है।
जॉन १०२४

ठीक है, शायद यही जवाब है। मैं कुछ दिनों के लिए प्रश्न को खुला छोड़ दूंगा कि क्या किसी और के पास इसका उत्तर है, तो इसे स्वीकार करें अन्यथा। धन्यवाद।
स्पार्कवॉक

@ श्रावक बहुत अच्छा।
जॉन १०२४

+1, लेकिन मैं एक और उत्तर स्वीकार करने जा रहा हूं , क्योंकि यह थोड़ा और ठोस परिस्थितिजन्य साक्ष्य प्रदान करता है कि यह काम नहीं करता है।
स्पर्हॉक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.