Как объединить несколько строк с именами файлов в одну с пользовательским разделителем?

Очевидно, что файл на GitHub действительно использует std::array, но не включает стандартный заголовок array .

В том числе это решило проблему.

385
задан 30.05.2015, 11:02

15 ответов

Аналогично самому первому варианту, но без конечного разделителя.

ls -1 | paste -sd "," -
603
ответ дан 04.10.2019, 13:38
  • 1
    Так же, как примечание версия вставки, которую я попробовал, требует "-" аргумент в конце, чтобы сказать ему читать из STDIN., например, ls -1 | paste -s -d ":" - Не уверенный, если that' s универсальный со всеми версиями вставки – Andy White 11.05.2012, 06:15

Версия 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
} <>'

Объяснить:

  • perl -E: выполнить Perl с поддержкой функций (скажем, ...)
  • говорят: печатать с возвратом носителя
  • join ",", ARRAY_HERE: соединять массив с помощью ","
  • map {chomp; $ _} ROWS: удалить из каждой строки возвращаемую несущую и вернуть результат
  • <>: stdin, каждая строка является ROW, в сочетании с картой она создаст массив каждой ROW
0
ответ дан 04.10.2019, 13:38

В добавление к ответу 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"
1
ответ дан 04.10.2019, 13:38

Если ваша версия xargs поддерживает флаг -d, тогда это должно сработать

ls  | xargs -d, -L 1 echo

-d - это флаг-разделитель

Если у вас нет -d, вы можете попробовать следующее

ls | xargs -I {} echo {}, | xargs echo

Первый xargs позволяет вам указать разделитель, который является запятой в этом примере.

3
ответ дан 04.10.2019, 13:38
  • 1
    -d определяет входной разделитель с GNU xargs, не, работают - также. Второй пример показывает ту же проблему как другие решения здесь случайного разделителя в конце. – Thor 14.09.2012, 05:09

Вы можете использовать:

ls -1 | perl -pe 's/\n$/some_delimiter/'
2
ответ дан 04.10.2019, 13:38

Эта команда для поклонников PERL:

ls -1 | perl -l40pe0

Здесь 40 - восьмеричный ascii-код для пространства.

-p будет обрабатывать построчно и печатать

-l позаботится о замене завершающего \ n на символ ascii, который мы предоставляем.

-e должен сообщить PERL, что мы выполняем командную строку.

0 означает, что на самом деле нет команды для выполнения.

perl -e0 совпадает с perl -e ''

7
ответ дан 04.10.2019, 13:38

Не изобретай велосипед.

ls -m

Это именно так.

9
ответ дан 04.10.2019, 13:38
  • 1
    OP хотел любой разделитель, таким образом, Вам все еще будет нужен TR для преобразования запятых. Это также добавляет пространство после запятых т.е. file1, file2, file3 – rob 26.04.2013, 22:50
  • 2
    так с помощью ls -m и tr для удаления пространства после запятой Вы сделали бы ls -m | tr -d ' ' – Andy 01.05.2013, 02:33
  • 3
    то использование TR удалит пробелы в именах файлов. лучше использовать sed 's/, /,/g – glenn jackman 08.05.2013, 00:45

просто bash

mystring=$(printf "%s|" *)
echo ${mystring%|}
7
ответ дан 04.10.2019, 13:38
  • 1
    Немного более эффективный должен был бы использовать " printf-v mystring " %s |" *" - который избегает ветвления за $ () – camh 09.05.2010, 23:56

ls производит один выходной столбец при подключении к трубе, поэтому -1 является избыточным.

Вот еще один ответ perl, использующий встроенную функцию join, которая не оставляет завершающий разделитель:

ls | perl -F'\n' -0777 -anE 'say join ",", @F'

Непонятный -0777 заставляет perl прочитать весь ввод перед запуском программы.

альтернатива sed, которая не оставляет завершающий разделитель

ls | sed '$!s/$/,/' | tr -d '\n'
2
ответ дан 04.10.2019, 13:38

Парсинг ls в целом не рекомендуется , поэтому альтернативным лучшим способом является использование find, например:

find . -type f -print0 | tr '\0' ','

Или с использованием find и paste:

find . -type f | paste -d, -s

Для общего объединения нескольких строк (не относящихся к файловой системе) проверьте: Краткое и переносимое «соединение» в командной строке Unix .

13
ответ дан 04.10.2019, 13:38

Комбинация настроек IFS и использования "$*" может сделать то, что вы хотите. Я использую подоболочку, поэтому я не вмешиваюсь в $ IFS этой оболочки

(set -- *; IFS=,; echo "$*")

Для захвата вывода,

output=$(set -- *; IFS=,; echo "$*")
14
ответ дан 04.10.2019, 13:38
  • 1
    У Вас есть еще некоторая информация относительно как set работы? Немного походит на вуду мне. мелкий взгляд до man set didn' t сеть я много информации также. – Ehtesh Choudhury 13.09.2013, 08:08
  • 2
    Если Вы даете 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 для предложения.

24
ответ дан 04.10.2019, 13:38

Чтобы избежать потенциальной путаницы новой строки для tr, мы могли бы добавить флаг -b к ls:

ls -1b | tr '\n' ';'
6
ответ дан 04.10.2019, 13:38

Я думаю, что это круто

ls -1 | awk 'ORS=","'

ORS - это «разделитель выходных записей», так что теперь ваши строки будут соединяться запятой.

19
ответ дан 04.10.2019, 13:38

РЕДАКТИРОВАТЬ : Просто " ls -m " Если вы хотите, чтобы ваш разделитель был запятой

Ах, сила и простота !

ls -1 | tr '\n' ','

Поменяйте запятую ", " на любую, какую хотите. Обратите внимание, что это включает "запятую"

353
ответ дан 04.10.2019, 13:38
  • 1
    +1, но более тщательно продуманная версия должен обработать последний \n по-другому – mouviciel 04.05.2010, 23:24
  • 2
    Если имя файла будет содержать \n в нем, это заменит это также. – codaddict 04.05.2010, 23:28
  • 3
    @unicornaddict можно использовать-b или-q для ls для обработки странных случаев как Вы упоминание. – zaf 04.05.2010, 23:40
  • 4
    @ShreevatsaR: он означает не добавлять запаздывание " " я верю. как так ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/' – Chris 09.03.2012, 09:21

Теги

Похожие вопросы