Як вивести рядки, відокремлені комами, використовуючи розширення дужки bash


17

я хотів б

$ echo a{b,c,d}

виводити список, відокремлений комами, як

ab,ac,ad

замість звичного виходу

ab ac ad

Який найпростіший спосіб зробити це в командному рядку?

Відповіді:


9

Припускаючи, що елементи не містять пробілів, ви можете перевести пробіли у коми:

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

яка виробляє:

ab,ac,ad

Ви також можете використовувати діапазони з символами:

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

Це особливо корисно, якщо ви хочете збільшити асортимент.


13

Здається, bash не використовує $ IFS для приєднання створених слів. Іншою технікою було б зберігання згенерованих слів у масиві, і тоді $ IFS буде в грі:

Я буду використовувати нижню частину оболонки, щоб не змінювати IFS цієї оболонки: виберіть один із

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

Це випромінює рядок, що розділяє кому до stdout. Якщо ви хочете зробити це:

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

Він зовсім не приєднується до створених слів. У цьому вся суть, вона розширюється на окремі слова.
Стефан Шазелас


2

Розгорніть такі елементи, як ви показали, а потім переведіть їх на петлю, додавши коску до всіх, крім першої ітерації:

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

Результат:

ab, ac, ad

Див. Підстановку параметрів bash .


1

Ось єдине рішення.

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

Частина перед крапкою з комою присвоюється ab ac adзмінній, INа друга частина використовує пошук і заміну для зміни всіх пробілів до коми. //Чи означає , що всі матчі, а не тільки перший.

Зробіть це все в підзаголовку (що додаються в дужки), щоб не забруднити простір імен.


1

Варто зазначити, що в багатьох контекстах у такому списку є прийнятна кома в кінці. ЯКЩО кінцева кома прийнятна, найпростіший спосіб вчинити із заміною printf:

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

(Де some-commandкоманда, яка працює у списку, розділеному комами, і не піклується про те, що йде через кому.)

Насправді, навіть якщо у вас не повинно бути кінцевої коми, яку ви можете використовувати printf; вам просто потрібно вказати кількість очікуваних аргументів, що робить його незграбним для дуже довгих списків:

some-command "$(printf %s,%s,%s a{b,c,d} )"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.