Jawaban:
Dengan asumsi bahwa elemen tidak mengandung spasi, Anda bisa menerjemahkan spasi menjadi koma:
echo a{b,c,d} | tr ' ' ,
yang menghasilkan:
ab,ac,ad
Anda juga dapat menggunakan rentang dengan karakter:
echo a{b..d} | tr ' ' ,
Ini sangat berguna jika Anda ingin rentang yang lebih besar.
Tampaknya bash tidak menggunakan $ IFS untuk bergabung dengan kata-kata yang dihasilkan. Teknik lain adalah menyimpan kata-kata yang dihasilkan dalam array dan kemudian $ IFS akan dimainkan:
Saya akan menggunakan subkulit jadi saya tidak mengubah IFS shell ini: pilih salah satu
( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )
Itu memancarkan koma-memisahkan string ke stdout. Jika Anda ingin menangkapnya:
joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )
Saya yakin ada banyak cara untuk mencapai ini. Berikut ini satu metode:
echo a{b,c,d} | sed 's/ /,/g'
Luaskan elemen seperti yang Anda tunjukkan dan kemudian lewati, tambahkan koma ke semua kecuali iterasi pertama:
for i in a{b,c,d}; do
u="${u:+$u, }$i"
done
echo "$u"
Hasil:
ab, ac, ad
Lihat substitusi parameter bash .
Inilah solusi bash-only.
(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad
Bagian sebelum tanda koma ditetapkan ab ac ad
ke variabel IN
dan bagian kedua menggunakan pencarian dan ganti untuk mengubah semua spasi menjadi koma. The //
berarti semua pertandingan, bukan hanya yang pertama.
Lakukan semuanya dalam subkulit (tanda kurung terlampir) untuk tidak mencemari namespace Anda.
Perlu dicatat bahwa dalam banyak konteks, koma tertinggal dapat diterima dalam daftar tersebut. JIKA trailing koma dapat diterima, cara termudah untuk menangani substitusi adalah printf
:
some-command "$(printf %s, a{b,c,d} )"
(Di mana some-command
ada perintah yang berjalan pada daftar yang dipisahkan koma, dan tidak peduli dengan koma yang tertinggal.)
Sebenarnya, bahkan jika Anda tidak harus memiliki tanda koma, Anda dapat menggunakan printf
; Anda hanya perlu menentukan jumlah argumen yang Anda harapkan, yang membuatnya menjadi asumsi yang sangat panjang:
some-command "$(printf %s,%s,%s a{b,c,d} )"