Cara mengeluarkan string yang dipisahkan koma menggunakan ekspansi bash brace

17

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?

Jeannie
sumber

Jawaban:

9

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.

devnull
sumber
13

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 "$*" )
glenn jackman
sumber
Itu tidak bergabung dengan kata-kata yang dihasilkan sama sekali. Itulah intinya, itu memperluas kata-kata yang terpisah.
Stéphane Chazelas
5

Saya yakin ada banyak cara untuk mencapai ini. Berikut ini satu metode:

echo a{b,c,d} | sed 's/ /,/g'
Timothy Martin
sumber
2

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 .

Marki
sumber
1

Inilah solusi bash-only.

(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad

Bagian sebelum tanda koma ditetapkan ab ac adke variabel INdan 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.

erg
sumber
1

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-commandada 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} )"
Wildcard
sumber