दाएं-से-बाएं खोल ब्रेस विस्तार


9

Zsh (और अन्य गोले) में, अगर मैं एक तर्क शामिल करता हूं जैसे (उदाहरण के लिए):

{a,b,c}{d,e,f}

ब्रेस विस्तार में बदल जाता है:

ad ae af bd be bf cd ce cf

मेरे उद्देश्यों के लिए, तर्क आदेश महत्वपूर्ण है, और मुझे बायें-से-बाएँ के बजाय दाएँ-से-बाएँ का विस्तार करने के लिए ब्रेसिज़ की आवश्यकता है। यही है, मैं चाहता हूं कि विस्तार हो:

ad bd cd ae be ce af bf cf

क्या आदेश को नियंत्रित करने का एक तरीका है कि ब्रेसिज़ के कई सेट का विस्तार किया जाता है? मैं ऐसी किसी चीज़ की तलाश में हूँ जो किसी भी स्थिति में काम करे, न कि सिर्फ इन तर्कों के साथ।


मुझे लगता है कि आप लूप या सॉर्ट किए गए आउटपुट से जुड़े अधिक जटिल समाधानों में रुचि नहीं रखते हैं, है ना?
terdon

@terdon अगर मुझे लगता है कि कोई अन्य तरीका नहीं है; मैं उम्मीद कर रहा था कि ब्रेस विस्तार के मूल्यांकन के क्रम को बदलने के लिए कुछ चाल थी, लेकिन शायद नहीं है। उन तर्कों, सिर्फ एक उदाहरण है, हालांकि थे तो कुछ है कि केवल के लिए काम करता {a,b,c}{d,e,f}बहुत उपयोगी नहीं है
माइकल Mrozek

हाँ, मैंने अनुमान लगाया है। आप क्रमबद्धता के आधार पर उत्तरों से बचने के लिए हालांकि इसे स्पष्ट करना चाहते हैं।
terdon

जवाबों:


8

आप ब्रेस विस्तार के साथ पैरामीटर विस्तार को जोड़ सकते हैं।

% foo=(d e f)
$ echo {a,b,c}${^foo}
ad bd cd ae be ce af bf cf

यदि आप fooअलग से परिभाषित नहीं करना चाहते (जैसा कि संभावना है), आप निम्नलिखित का उपयोग कर सकते हैं:

$ echo {a,b,c}${^:-d e f}
ad bd cd ae be ce af bf cf

यदि आपके पास rcexpandparamविकल्प सेट है, तो आपको ^इस व्यवहार को सक्षम करने के लिए किसी भी उदाहरण की आवश्यकता नहीं है।

(नोट: परीक्षण करते समय, मेरे पास shwordsplitविकल्प सेट भी था । यदि आपके पास यह सेट नहीं है, तो उदाहरण के लिए, कोशिश करें echo {a,b,c}${^=:-d e f}। कहानी का नैतिक: लगभग कुछ भी संभव है zsh, लेकिन आपको यह सुनिश्चित करना होगा कि आप सही का उपयोग कर रहे हैं विकल्पों और वाक्यविन्यास का संयोजन।)


1
आपको print -- {a,b,c}${^=:-d e f}मुख्य उदाहरण के रूप में उपयोग करना चाहिए , क्योंकि split+globडिफ़ॉल्ट रूप से बंद कर दिया गया था zsh
congonglm

4

में zshआप उपयोग कर सकते -C स्तंभों की निर्धारित संख्या को तर्क printकी तरह:

print $(print -C3 {a,b,c}{d,e,f})

...लेना...

ad bd cd ae be ce af bf cf

... $IFSनिम्नलिखित विभाजन के बिना :

print -C3 {a,b,c}{d,e,f}

... प्रिंट ...

ad bd cd
ae be ce
af bf cf

... लेकिन आप ऐसा कर सकते हैं नीचे से पहले की तरह ...

print -aC3 {a,b,c}{d,e,f}

ad ae af
bd be bf
cd ce cf

... या ...

print $(print -aC2 {foo,bar}{bad,baz})

foobad foobaz barbad barbaz

यह वही आउटपुट उत्पन्न करता है जिससे MIchael बचने की कोशिश कर रहा है। वह 1.1 2.1 3.1 चाहता है और आप 1.1 1.2 1.3 दे रहे हैं (यदि यह स्पष्ट है)।
terdon

@terdon - अच्छी बात है।
माइकर्स

मैं अनुमान लगा रहा हूं (हालांकि स्पष्ट रूप से नहीं कहा गया है) कि माइकल पेयरिंग के विशिष्ट आदेश के बाद है। आपका दृष्टिकोण केवल तभी काम करता है जब तत्वों को वर्णानुक्रम में क्रमबद्ध किया जा सकता है। foobad foobaz barbad barbaz{Foo, bar} {bad, baz} `से प्राप्त करने के बारे में क्या ?
terdon

@terdon - ठीक है, अगर ऐसा है तो उसके बाद ऐसा क्यों नहीं है? और वैसे भी, कॉलम को किसी भी तरह से जोड़ा जा सकता है यदि आप गणित करते हैं।
15

1
@terdon - आप मध्यस्थ यह कहने की आदत बनाते हैं कि आपका क्या मतलब नहीं है।
24

2

आप दूसरे सेट के प्रत्येक तत्व के अंत में संख्या डाल सकते हैं और फिर अंतिम वर्ण पर छाँट सकते हैं:

echo -e "\n"{a,b,c}{d1,e2,f3} | sort -k 1.3 | cut -c 1-2 | tr '\n' ' '

कुछ विभाजक (स्पेस) के बाद संख्याओं को जोड़ना बेहतर होगा, फ़ील्ड्स को काटने के लिए, वर्ण नहीं:

echo -e "\n"{a,b,c}{"d 1","e 2","f 3"} | sort -k 2n | cut -f 1 -d ' ' -s | tr '\n' ' '

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