Aynı anda küme ayracı (permütasyon) ve dizi genişletme kullanılabilir mi?


12

Bash'in {}genişleme sözdizimi kolay permütasyonlar oluşturmaya izin verir

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

/ Nasıl mümkün oldukça garip kullanımda hariç diziler ile birlikte bu kullanmak Ancak bana açık değil $() echoveeval

Kıvrık ayraç (permütasyon) genişlemesi olan dizileri kullanmanın basit bir yolu var mı?

Örneğin aşkına, (elbette işe yaramaz) gibi bir şey düşünün:

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

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

Farklı istiyorsanız GNU bash, version 4.2.24 Çıktı'da çalışıyor, root@router:~# echo {${CONS[@]}}{${VOWEL[@]}} {b c d}{a e i o u}.sonra bize bildirin .. ``
Rahul Patil

3
@RahulPatil OP istiyor ba be bi bo bu ca ce ci co cu da de di do du.
terdon

Yanıtlar:


10

Eval ile IFS=,; "${array[*]}"(değerleri virgülle birleştiren) veya döngüler için yalnızca iki tanesini kullanabilirsiniz:

$ 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

Şunlarla mümkündür 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

Veya 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

İle bashya ksh93, şöyle dolambaçlı bir şey yapmak olurdu:

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

2
Zsh kullanmak için bir neden daha.
Kevin

Bunu bash'da yapmanın daha doğrudan bir yolu olmadığından emin misiniz? Yoksa sadece olduğundan şüpheleniyor musunuz?
Catskul

@Catskul, hayır, kesinlikle şüpheliyim ama emin değilim, bir takım özelliklerin belgelenmediği ksh93 için daha az eminim. Soruyu bir süre açık bırakmak isteyebilirsiniz. Eminim başka bir değerlendirme seviyesi olmadan ( evalveya ile .) küme ayracı genişleme ile yapamazsınız .
Stéphane Chazelas

eval "echo {$(printf ',%s' "${CONS[@]}" "${VOWEL[@]}" | tail -c+2)}"(Yine de tek bir eleman için çalışmıyor.)
Rockallite

2

Eğlenceli, ama muhtemelen en iyisi değil.

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

Doğru, ancak sorudan ima edilmeyen sesli harflerin tekrarlanmasını gerektirir (her biri CONS ve VOWEL'e statik bir liste atama).
Jeff Schaller
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.