在 bash 中组合 Grep 和 Paste 命令

Combining Grep and Paste command in bash

很抱歉问了一个愚蠢的问题,但我对这件事很着迷。

所以,我在 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

非常感谢

我会使用 printf 及其 -v 选项,然后使用参数扩展。

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

第一行产生a.bed, b.bed, c.bed, 。第二行修剪尾随 , .

如果您只需要一个单字符分隔符,另一种方法是使用带有 IFS:

的数组
$ beds=$(a=(*.bed); IFS=,; echo "${a[*]}")

您可以单独使用 ls 'x' 和 'm' 选项:

beds=$(ls -xm *.bed)

echo $beds
a.bed, b.bed, c.bed

这是一个有点古怪的:

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

在上面的示例中,我们通过使用 $() 执行它来删除 ls 输出中的换行符。然后我们使用生成的字符串作为 tr 的输入,用逗号替换所有空格。

我最喜欢的是在 ls 中使用内置的 -xm 参数,但这个特定的答案可以应用于其他不提供 ls 提供的丰富输出格式集的可执行文件。

对于这个特定的案例有点矫枉过正,但仅供参考,您可以这样做:

$ 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