एक साथ ब्रेस (क्रमपरिवर्तन) और सरणी विस्तार का उपयोग करना संभव है?


12

बैश का {}ब्रेस विस्तार सिंटैक्स आसान क्रमपरिवर्तन बनाने की अनुमति देता है

# echo {b,c,d}{a,e,i,o,u}
ba be bi bo bu ca ce ci co cu da de di do du

हालांकि यह मेरे लिए स्पष्ट करता है, तो / कैसे यह संभव है की बहुत ही अजीब उपयोग में छोड़कर सरणियों के साथ इस का उपयोग नहीं कर रहा है $() echoऔरeval

कर्ली ब्रेस (क्रमपरिवर्तन) विस्तार के साथ सरणियों का उपयोग करने का एक सरल तरीका है?

उदाहरण के लिए, कुछ ऐसा सोचें (जो निश्चित रूप से काम नहीं करता है):

CONS=( b c d )
VOWEL=( a e i o u )

echo {${CONS[@]}}{${VOWEL[@]}}

यह GNU bash, version 4.2.24 आउटपुट में काम कर रहा है root@router:~# echo {${CONS[@]}}{${VOWEL[@]}} {b c d}{a e i o u}.यदि आप अलग-अलग चाहते हैं तो हमें बताएं .. `
राहुल पाटिल

3
@RahulPatil ओपी चाहता है ba be bi bo bu ca ce ci co cu da de di do du
terdon

जवाबों:


10

आप के साथ eval का उपयोग कर सकते हैं IFS=,; "${array[*]}"(जो अल्पविराम के साथ मूल्यों में शामिल होता है) या छोरों के लिए सिर्फ दो:

$ CONS=(b c d);VOWEL=(a e i o u)
$ IFS=,;eval echo "{${CONS[*]}}{${VOWEL[*]}}"
ba be bi bo bu ca ce ci co cu da de di do du
$ for c in "${CONS[@]}";do for v in "${VOWEL[@]}";do echo "$c$v";done;done|paste -sd' ' -
ba be bi bo bu ca ce ci co cu da de di do du

9

यह संभव है zsh:

$ CONS=( b c d )
$ VOWEL=( a e i o u )
$ echo $^CONS$^VOWEL
ba be bi bo bu ca ce ci co cu da de di do du

या es:

; VOWEL=( a e i o u )
; CONS=( b c d )
; echo $VOWEL^$CONS
ab ac ad eb ec ed ib ic id ob oc od ub uc ud

साथ bashया ksh93, आप की तरह घुमावदार कुछ करने के लिए चाहते हैं:

VOWEL=( a e i o u )
CONS=( b c d )
qVOWEL=$(printf %q, "${VOWEL[@]}")
qCONS=$(printf %q, "${CONS[@]}")
eval "echo {${qVOWEL%,}}{${qCONS%,}}"

2
Zsh का उपयोग करने का सिर्फ एक कारण।
केविन

क्या आप निश्चित हैं कि इसे बैश करने का कोई और सीधा तरीका नहीं है? या आपको सिर्फ शक है कि ऐसा है?
22

@ कत्स्कुल, नहीं, मैं दृढ़ता से संदेह करता हूं, लेकिन मैं निश्चित नहीं हूं, मैं ksh93 के लिए भी कम निश्चित हूं जहां कई विशेषताओं का दस्तावेजीकरण नहीं किया गया है। आप प्रश्न को कुछ समय के लिए खुला छोड़ना चाह सकते हैं। मैं बहुत यकीन है कि आप मूल्यांकन (साथ का एक और स्तर के बिना ब्रेस विस्तार के साथ ऐसा नहीं कर सकते हैं evalया .) यद्यपि।
स्टीफन चेज़लस

eval "echo {$(printf ',%s' "${CONS[@]}" "${VOWEL[@]}" | tail -c+2)}"(हालांकि एकल तत्व के लिए काम नहीं कर रहा है।)
रॉकलाईट

2

मज़ा, लेकिन शायद सबसे अच्छा नहीं।

temparr=( b{a,e,i,o,u} c{a,e,i,o,u} d{a,e,i,o,u} )
echo "${temparr[@]}"

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