Я хотел бы объединить результат ls -1
в одну строку и разделить его с тем, что я хочу.
Есть ли какие-либо стандартные команды Linux, которые я могу использовать для достижения этой цели?
Аналогичен самому первому варианту, но пропускает конечный разделитель
ls -1 | paste -sd "," -
ls -1 | paste -s -d ":" -
не уверен, что это универсально со всеми версиями пастыpaste
получает-
(стандартный ввод) по умолчанию, по крайней мере, на моемpaste (GNU coreutils) 8.22
."\0"
, так чтоpaste -sd "\0" -
работал для меня!Ах, сила и простота!
Поменяйте запятую " , " на что хотите. Обратите внимание, что это включает "запятую"
источник
\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 -m
включает символы новой строки в ширину экрана (например, 80-е).В основном Bash (только
ls
внешне):Использование
readarray
(иначеmapfile
) в Bash 4:Спасибо gniourf_gniourf за предложения.
источник
mapfile
(Bash) ≥4 как:mapfile -t files < <(ls -1)
. Не надо возитьсяIFS
. И это тоже короче.IFS
чтобы присоединиться поля:saveIFS=$IFS; IFS=,; list=${files[*]}; IFS=$saveIFS
. Или используйте другой метод, если вы хотите разделитель с более чем одним символом.Я думаю, что это потрясающе
ORS является «разделителем выходных записей», поэтому теперь ваши строки будут соединяться запятой.
источник
" OR "
)Комбинация настроек
IFS
и использования"$*"
может делать то, что вы хотите. Я использую подоболочку, поэтому я не вмешиваюсь в $ IFS этой оболочкиЧтобы захватить вывод,
источник
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
иpaste
:Для общего объединения нескольких строк (не относящихся к файловой системе), проверьте: сжатое и переносимое «соединение» в командной строке Unix .
источник
Не изобретай велосипед.
Это именно так.
источник
ls -m
и,tr
чтобы удалить пробел после запятой, вы бы сделалиls -m | tr -d ' '
sed 's/, /,/g
просто удар
источник
|
смущает отставание , @camh.bash
гну и coreutilsprintf
printf -v
будет работать только в bash, в то время как представленный ответ работает на многих типах оболочек.|
, при условии , что используются оба линий:printf -v mystring "%s|" * ; echo ${mystring%|}
.Эта команда для поклонников PERL:
Здесь 40 - восьмеричный восьмеричный код для пространства.
-p будет обрабатывать построчно и печатать
-l позаботится о замене завершающего \ n символом ascii, который мы предоставляем.
-e должен сообщить PERL, что мы выполняем командную строку.
0 означает, что на самом деле нет команды для выполнения.
perl -e0 совпадает с perl -e ''
источник
Чтобы избежать путаницы с новой строкой для tr, мы можем добавить флаг -b к ls:
источник
Похоже, ответы уже существуют.
Если вы хотите
a, b, c
форматировать, используйтеls -m
( ответ Tulains Córdova )Или, если вы хотите
a b c
форматировать, используйтеls | xargs
(упрощенная версия ответа Криса J )Или, если вы хотите любой другой разделитель, как
|
, используйтеls | paste -sd'|'
(применение ответа Артема )источник
Седь,
Примечание :
Это линейный по сложности, заменяющий только один раз после того, как все строки добавлены в Pattern Space.
@ AnandRajaseka в ответ , и некоторые другие подобные ответы, такие , как здесь , являются O (n²), потому что СЭД должна делать заменить каждый раз , когда новая строка добавляется в шаблон пространства.
Сравнивать,
источник
Добавляя поверх ответа majkinetor, вот способ удаления конечного разделителя (поскольку я пока не могу просто комментировать его ответ):
Просто удалите столько конечных байтов, сколько рассчитывает ваш разделитель.
Мне нравится этот подход, потому что я могу использовать многосимвольные разделители + другие преимущества
awk
:РЕДАКТИРОВАТЬ
Как заметил Питер, отрицательный счетчик байтов не поддерживается в родной версии головы MacOS. Это, однако, может быть легко исправлено.
Сначала установите
coreutils
. «Основные утилиты GNU - это базовые утилиты для работы с файлами, оболочками и текстом в операционной системе GNU».Команды, также предоставляемые MacOS, устанавливаются с префиксом «g». Например
gls
.После того, как вы это сделаете, вы можете использовать
ghead
с отрицательным числом байтов или, лучше, сделать псевдоним:источник
Если ваша версия xargs поддерживает флаг -d, это должно работать
-d - флаг-разделитель
Если у вас нет -d, вы можете попробовать следующее
Первый xargs позволяет вам указать разделитель, который в этом примере является запятой.
источник
-d
задает входной разделитель с помощью GNU xargs, поэтому не будет работать. Второй пример демонстрирует ту же проблему, что и другие решения здесь, в отношении случайного разделителя в конце.Объяснение:
-e
- обозначает команду, которая должна быть выполнена:a
- является меткой/$/N
- определяет область совпадения для текущей и (N) ext строкиs/\n/\\n/;
- заменяет все EOL на\n
ta;
- идет на метку a, если совпадение прошло успешноВзято из моего блога .
источник
Ты можешь использовать:
источник
ls
при подключении к каналу выводит один столбец, поэтому он-1
является избыточным.Вот еще один ответ Perl, использующий встроенную
join
функцию, которая не оставляет завершающий разделитель:Непонятный
-0777
заставляет Perl читать все вводные данные перед запуском программы.альтернатива sed, которая не оставляет завершающий разделитель
источник
ls
имеет возможность-m
разделить вывод", "
запятой и пробелом.Если вы передадите этот результат, чтобы
tr
удалить пробел или запятую, вы сможете снова передать результат,tr
чтобы заменить разделитель.в моем примере я заменяю разделитель
,
разделителем;
замените его
;
любым предпочитаемым символом , так как tr учитывает только первый символ в строках, которые вы передаете в качестве аргументов.источник
Вы можете использовать chomp для объединения нескольких строк в одну строку:
perl -e 'while (<>) {if (/ \ $ /) {chomp; } print;} 'bad0> test
поставить условие разрыва строки в операторе if. Это может быть специальный символ или любой разделитель.
источник
Версия Quick Perl с обработкой косой черты:
Объяснить:
источник