Версия Quick Perl с завершающей косой чертой:
ls -1 | perl -E 'say join ", ", map {chomp; Версия Quick Perl с завершающей косой чертой:
[110] Объяснить:
- perl -E: выполнить Perl с поддержкой функций (скажем, ...)
- говорят: печатать с возвратом носителя
- join ",", ARRAY_HERE: соединять массив с помощью ","
- map {chomp; $ _} ROWS: удалить из каждой строки возвращаемую несущую и вернуть результат
- <>: stdin, каждая строка является ROW, в сочетании с картой она создаст массив каждой ROW
} <>'
Объяснить:
В добавление к ответу 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, не, работают - также. Второй пример показывает ту же проблему как другие решения здесь случайного разделителя в конце.
– Thor
14.09.2012, 05:09
Эта команда для поклонников PERL:
ls -1 | perl -l40pe0
Здесь 40 - восьмеричный ascii-код для пространства.
-p будет обрабатывать построчно и печатать
-l позаботится о замене завершающего \ n на символ ascii, который мы предоставляем.
-e должен сообщить PERL, что мы выполняем командную строку.
0 означает, что на самом деле нет команды для выполнения.
perl -e0 совпадает с perl -e ''
ls -m
и tr
для удаления пространства после запятой Вы сделали бы ls -m | tr -d ' '
– Andy
01.05.2013, 02:33
sed 's/, /,/g
– glenn jackman
08.05.2013, 00:45
просто bash
mystring=$(printf "%s|" *)
echo ${mystring%|}
ls
производит один выходной столбец при подключении к трубе, поэтому -1
является избыточным.
Вот еще один ответ perl, использующий встроенную функцию join
, которая не оставляет завершающий разделитель:
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
Непонятный -0777
заставляет perl прочитать весь ввод перед запуском программы.
альтернатива sed, которая не оставляет завершающий разделитель
ls | sed '$!s/$/,/' | tr -d '\n'
Парсинг ls
в целом не рекомендуется , поэтому альтернативным лучшим способом является использование find
, например:
find . -type f -print0 | tr '\0' ','
Или с использованием find
и paste
:
find . -type f | paste -d, -s
Для общего объединения нескольких строк (не относящихся к файловой системе) проверьте: Краткое и переносимое «соединение» в командной строке Unix .
Комбинация настроек IFS
и использования "$*"
может сделать то, что вы хотите. Я использую подоболочку, поэтому я не вмешиваюсь в $ IFS этой оболочки
(set -- *; IFS=,; echo "$*")
Для захвата вывода,
output=$(set -- *; IFS=,; echo "$*")
set
работы? Немного походит на вуду мне. мелкий взгляд до man set
didn' t сеть я много информации также.
– Ehtesh Choudhury
13.09.2013, 08:08
set
набор аргументов, но никакие опции, он устанавливает позиционные параметры (1$, 2$...). --
там для защиты set
в случае, если первый аргумент (или имя файла в этом случае), оказывается, запускается с тире. См. описание --
опция в help set
. Я нахожу позиционные параметры удобным способом обработать список вещей. Я, возможно, также реализовал это с массивом: output=$( files=(*); IFS=,; echo "${files[*]}" )
– glenn jackman
13.09.2013, 08:16
Это заменяет последнюю запятую новой строкой:
ls -1 | tr '\n' ',' | sed 's/,$/\n/'
ls -m
включает переводы строки с шириной экрана (например, 80-й).
В основном Bash (только ls
является внешним):
saveIFS=$IFS; IFS= Использование readarray
(он же mapfile
) в Bash 4:
readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS
Благодаря gniourf_gniourf для предложения.
\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 для предложения.
Я думаю, что это круто
ls -1 | awk 'ORS=","'
ORS - это «разделитель выходных записей», так что теперь ваши строки будут соединяться запятой.
РЕДАКТИРОВАТЬ : Просто " ls -m " Если вы хотите, чтобы ваш разделитель был запятой
Ах, сила и простота !
ls -1 | tr '\n' ','
Поменяйте запятую ", " на любую, какую хотите. Обратите внимание, что это включает "запятую"
ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
– Chris
09.03.2012, 09:21
ls -1 | paste -s -d ":" -
Не уверенный, если that' s универсальный со всеми версиями вставки – Andy White 11.05.2012, 06:15