Ответы:
Аналогичен самому первому варианту, но пропускает конечный разделитель
ls -1 | paste -sd "," -
pasteполучает -(стандартный ввод) по умолчанию, по крайней мере, на моем paste (GNU coreutils) 8.22.
"\0", так что paste -sd "\0" -работал для меня!
РЕДАКТИРОВАТЬ : просто " ls -m ", если вы хотите, чтобы ваш разделитель был запятой
Ах, сила и простота!
ls -1 | tr '\n' ','
Поменяйте запятую " , " на что хотите. Обратите внимание, что это включает "запятую"
\nв нем, это также заменит это.
ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sedмогли бы быть немного более эффективными с символом конечного маркера:ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sedпосле, trкажется, просто для удаления последнего символа кажется неразумным. Я иду сls -1 | tr '\n' ',' | head -c -1
Это заменяет последнюю запятую новой строкой:
ls -1 | tr '\n' ',' | sed 's/,$/\n/'
ls -m включает символы новой строки в ширину экрана (например, 80-е).
В основном Bash (только lsвнешне):
saveIFS=$IFS; IFS=$'\n'
files=($(ls -1))
IFS=,
list=${files[*]}
IFS=$saveIFS
Использование readarray(иначе mapfile) в Bash 4:
readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS
Спасибо gniourf_gniourf за предложения.
mapfile(Bash) ≥4 как: mapfile -t files < <(ls -1). Не надо возиться IFS. И это тоже короче.
IFSчтобы присоединиться поля: saveIFS=$IFS; IFS=,; list=${files[*]}; IFS=$saveIFS. Или используйте другой метод, если вы хотите разделитель с более чем одним символом.
Я думаю, что это потрясающе
ls -1 | awk 'ORS=","'
ORS является «разделителем выходных записей», поэтому теперь ваши строки будут соединяться запятой.
" OR ")
Комбинация настроек IFSи использования "$*"может делать то, что вы хотите. Я использую подоболочку, поэтому я не вмешиваюсь в $ IFS этой оболочки
(set -- *; IFS=,; echo "$*")
Чтобы захватить вывод,
output=$(set -- *; IFS=,; echo "$*")
setработает? Для меня это выглядит как вуду. поверхностный просмотр man setне принес мне много информации.
setкучу аргументов, но без опций, он устанавливает позиционные параметры ($ 1, $ 2, ...). --защищать setв случае, если первый аргумент (или имя файла в этом случае) начинается с тире. Смотрите описание --опции в help set. Я считаю позиционные параметры удобным способом обработки списка вещей. Я мог бы также реализовать это с помощью массива:output=$( files=(*); IFS=,; echo "${files[*]}" )
type setскажет вам set is a shell builtin. Так что, man setне поможет, но help setсделаю. Ответ: «- Присвойте все оставшиеся аргументы позиционным параметрам».
set -- *. Отсрочка расширения *одного уровня вы можете получить правильный вывод без необходимости подпроекта оболочки: IFS=',' eval echo '"$*"'. Конечно, это изменит позиционные параметры.
lsВ целом, синтаксический анализ не рекомендуется , поэтому лучше использовать альтернативный способ find, например:
find . -type f -print0 | tr '\0' ','
Или с помощью findи paste:
find . -type f | paste -d, -s
Для общего объединения нескольких строк (не относящихся к файловой системе), проверьте: сжатое и переносимое «соединение» в командной строке Unix .
Не изобретай велосипед.
ls -m
Это именно так.
ls -mи, trчтобы удалить пробел после запятой, вы бы сделалиls -m | tr -d ' '
sed 's/, /,/g
просто удар
mystring=$(printf "%s|" *)
echo ${mystring%|}
|смущает отставание , @camh.
bashгну и coreutilsprintf
printf -vбудет работать только в bash, в то время как представленный ответ работает на многих типах оболочек.
|, при условии , что используются оба линий: printf -v mystring "%s|" * ; echo ${mystring%|}.
Эта команда для поклонников PERL:
ls -1 | perl -l40pe0
Здесь 40 - восьмеричный восьмеричный код для пространства.
-p будет обрабатывать построчно и печатать
-l позаботится о замене завершающего \ n символом ascii, который мы предоставляем.
-e должен сообщить PERL, что мы выполняем командную строку.
0 означает, что на самом деле нет команды для выполнения.
perl -e0 совпадает с perl -e ''
Похоже, ответы уже существуют.
Если вы хотите
a, b, cформатировать, используйте ls -m( ответ Tulains Córdova )
Или, если вы хотите a b cформатировать, используйте ls | xargs(упрощенная версия ответа Криса J )
Или, если вы хотите любой другой разделитель, как |, используйте ls | paste -sd'|'(применение ответа Артема )
Седь,
sed -e ':a; N; $!ba; s/\n/,/g'
# :a # label called 'a'
# N # append next line into Pattern Space (see info sed)
# $!ba # if it's the last line ($) do not (!) jump to (b) label :a (a) - break loop
# s/\n/,/g # any substitution you want
Примечание :
Это линейный по сложности, заменяющий только один раз после того, как все строки добавлены в Pattern Space.
@ AnandRajaseka в ответ , и некоторые другие подобные ответы, такие , как здесь , являются O (n²), потому что СЭД должна делать заменить каждый раз , когда новая строка добавляется в шаблон пространства.
Сравнивать,
seq 1 100000 | sed ':a; N; $!ba; s/\n/,/g' | head -c 80
# linear, in less than 0.1s
seq 1 100000 | sed ':a; /$/N; s/\n/,/; ta' | head -c 80
# quadratic, hung
Добавляя поверх ответа majkinetor, вот способ удаления конечного разделителя (поскольку я пока не могу просто комментировать его ответ):
ls -1 | awk 'ORS=","' | head -c -1
Просто удалите столько конечных байтов, сколько рассчитывает ваш разделитель.
Мне нравится этот подход, потому что я могу использовать многосимвольные разделители + другие преимущества awk:
ls -1 | awk 'ORS=", "' | head -c -2
РЕДАКТИРОВАТЬ
Как заметил Питер, отрицательный счетчик байтов не поддерживается в родной версии головы MacOS. Это, однако, может быть легко исправлено.
Сначала установите coreutils. «Основные утилиты GNU - это базовые утилиты для работы с файлами, оболочками и текстом в операционной системе GNU».
brew install coreutils
Команды, также предоставляемые MacOS, устанавливаются с префиксом «g». Например gls.
После того, как вы это сделаете, вы можете использовать gheadс отрицательным числом байтов или, лучше, сделать псевдоним:
alias head="ghead"
Если ваша версия xargs поддерживает флаг -d, это должно работать
ls | xargs -d, -L 1 echo
-d - флаг-разделитель
Если у вас нет -d, вы можете попробовать следующее
ls | xargs -I {} echo {}, | xargs echo
Первый xargs позволяет вам указать разделитель, который в этом примере является запятой.
-dзадает входной разделитель с помощью GNU xargs, поэтому не будет работать. Второй пример демонстрирует ту же проблему, что и другие решения здесь, в отношении случайного разделителя в конце.
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
Объяснение:
-e- обозначает команду, которая должна быть выполнена
:a- является меткой
/$/N- определяет область совпадения для текущей и (N) ext строки
s/\n/\\n/;- заменяет все EOL на \n
ta;- идет на метку a, если совпадение прошло успешно
Взято из моего блога .
Ты можешь использовать:
ls -1 | perl -pe 's/\n$/some_delimiter/'
lsпри подключении к каналу выводит один столбец, поэтому он -1является избыточным.
Вот еще один ответ Perl, использующий встроенную joinфункцию, которая не оставляет завершающий разделитель:
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
Непонятный -0777заставляет Perl читать все вводные данные перед запуском программы.
альтернатива sed, которая не оставляет завершающий разделитель
ls | sed '$!s/$/,/' | tr -d '\n'
lsимеет возможность -mразделить вывод ", "запятой и пробелом.
ls -m | tr -d ' ' | tr ',' ';'
Если вы передадите этот результат, чтобы trудалить пробел или запятую, вы сможете снова передать результат, trчтобы заменить разделитель.
в моем примере я заменяю разделитель ,разделителем;
замените его ;любым предпочитаемым символом , так как tr учитывает только первый символ в строках, которые вы передаете в качестве аргументов.
Версия Quick Perl с обработкой косой черты:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
Объяснить:
ls -1 | paste -s -d ":" -не уверен, что это универсально со всеми версиями пасты