Bas küme ayracı genişletme kullanarak virgülle ayrılmış dizeler çıktısı


17

isterim ki

$ echo a{b,c,d}

gibi virgülle ayrılmış bir liste çıkarmak için

ab,ac,ad

normal çıktı yerine

ab ac ad

Bunu komut satırında yapmanın en kolay yolu nedir?

Yanıtlar:


9

Öğelerin boşluk içermediğini varsayarsak, boşlukları virgüllere çevirebilirsiniz:

echo a{b,c,d} | tr ' ' ,

hangi üretir:

ab,ac,ad

Aralıklı karakterleri de kullanabilirsiniz:

echo a{b..d} | tr ' ' ,

Bu, daha geniş bir aralık istiyorsanız özellikle yararlıdır.


13

Görünüşe göre bash, oluşturulan kelimelere katılmak için $ IFS kullanmıyor. Başka bir teknik, oluşturulan kelimeleri bir dizide saklamak ve daha sonra $ IFS oyunda olacaktır :

Alt kabuk kullanacağım, bu yüzden bu kabuğun IFS'sini değiştirmem:

( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )

Bu, virgülle ayırılan dizgiyi stdout'a yayar. Yakalamak istiyorsanız:

joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )

O mu değil tüm üretilen kelimeleri katılmak. Bütün mesele bu, kelimeleri ayırmak için genişliyor.
Stéphane Chazelas

5

Eminim bunu başarmanın birçok yolu vardır. İşte bir yöntem:

echo a{b,c,d} | sed 's/ /,/g'

2

Gösterdiğiniz öğeleri genişletin ve ardından ilk yineleme dışındaki herkese virgül ekleyerek bunların üzerine gelin:

for i in a{b,c,d}; do
  u="${u:+$u, }$i"
done
echo "$u"

Sonuç:

ab, ac, ad

Bkz. Bash parametresi ikamesi .


1

İşte sadece bash bir çözüm.

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

Noktalı virgülden önceki bölüm ab ac addeğişkeni atar INve ikinci bölüm tüm boşlukları virgülle değiştirmek için arama ve değiştirme işlevlerini kullanır. Bunun //anlamı, sadece ilk değil tüm eşleşmelerdir.

Ad alanınızı kirletmemek için hepsini bir alt kabukta (kapalı parantezler) yapın.


1

Birçok bağlamda, böyle bir listede bir virgülün kabul edilebilir olduğunu belirtmek gerekir. IF bir arka virgül kabul edilebilir, ikame işlemek için en kolay yolu printf:

some-command "$(printf %s, a{b,c,d} )"

( some-commandVirgülle ayrılmış bir listede çalışan ve sondaki virgülle ilgilenmeyen bir komut nerede .)

Aslında, sondaki virgülünüz olmasa bile kullanabilirsiniz printf; sadece beklediğiniz bağımsız değişken sayısını belirtmeniz gerekir, bu da onu çok uzun listeler için daha karmaşık hale getirir:

some-command "$(printf %s,%s,%s a{b,c,d} )"
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.