Как вывести строки через запятую, используя расширение bash brace


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 "$*" )

Это испускает разделенную запятыми строку в стандартный вывод. Если вы хотите захватить это:

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

Вот решение только для bash.

(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.