saya ingin
$ echo a{b,c,d}
untuk menghasilkan daftar seperti dipisahkan koma
ab,ac,ad
bukannya output yang biasa
ab ac ad
Apa cara termudah untuk melakukannya di baris perintah?
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:
sumber
Luaskan elemen seperti yang Anda tunjukkan dan kemudian lewati, tambahkan koma ke semua kecuali iterasi pertama:
Hasil:
Lihat substitusi parameter bash .
sumber
Inilah solusi bash-only.
Bagian sebelum tanda koma ditetapkan
ab ac ad
ke variabelIN
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.
sumber
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
:(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:sumber