Объединение команд Grep и Paste в bash - PullRequest
0 голосов
/ 03 мая 2019

очень жаль задавать глупый вопрос, но я схожу с ума от этой штуки.

Итак, я в bash и у меня есть несколько файлов:

ls
a.bed
b.bed
c.bed

все, что я хочу сделать, - это создать переменную, в которой все 3 из них разделены запятой, вот что я ищу:

a.bed, b.bed, c.bed

То, что я сейчас использую (но вместо запятых есть пробелы):

beds=$(ls|grep .bed)

которые имеют

a.bed b.bed c.bed

Большое спасибо

Ответы [ 4 ]

7 голосов
/ 03 мая 2019

Я бы использовал printf и его опцию -v, после чего следовало бы использовать расширение параметров.

$ printf -v beds '%s, ' *.bed
$ beds=${beds%, }

Первая строка выдает a.bed, b.bed, c.bed, . Вторая строка обрезает трейлинг , .

Если вам нужен только односимвольный разделитель, альтернативой является использование массива с IFS:

$ beds=$(a=(*.bed); IFS=,; echo "${a[*]}")
6 голосов
/ 03 мая 2019

Вы можете сделать это только с опциями ls 'x' и 'm':

beds=$(ls -xm *.bed)

эхо $ кроватей
a.bed, b.bed, c.bed

0 голосов
/ 04 мая 2019

Избыток для этого конкретного случая, но вы можете сделать это просто как: к вашему сведению:

$ bedsArr=( *.bed )
$ bedsStr=$( printf '%s, ' "${bedsArr[@]:0:$((${#bedsArr[@]} - 1))}"; printf "%s\n" "${bedsArr[@]: -1:1}" )
$ printf '%s\n' "$bedsStr"
a.bed, b.bed, c.bed
0 голосов
/ 03 мая 2019

Вот один немного странный:

beds=$( tr \  , <<< $(ls *.bed))

В приведенном выше примере мы избавляемся от новых строк в выводе ls, просто выполняя его с помощью $(). Затем мы используем полученную строку в качестве входных данных для tr, которая заменяет все пробелы запятыми.

Мой фаворит - использование встроенных параметров -xm в ls, но этот конкретный ответ может применяться к другим исполняемым файлам, которые не предоставляют богатый набор форматов вывода, который ls делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...