从 bash for 循环生成的字符串中删除最后一个逗号

mkc*_*mkc 6 bash sed here-document for

我正在处理一种情况,我需要从数组中创建一个逗号分隔的列表到一个 heredoc 并删除最后一个逗号。我正在使用 bashfor管道sed,它正在擦除所有逗号而不是最后一个。一个简化的例子如下:

x=$(for i in a b c; do echo "${i}",; done| sed 's/,$//')
echo $x
a b c
Run Code Online (Sandbox Code Playgroud)

期望的输出:

a, b, c
Run Code Online (Sandbox Code Playgroud)

任何建议表示赞赏。

iru*_*var 10

一种选择是坚持 bash

arr=(a b c)
x=$(IFS=,;printf  "%s" "${arr[*]}")
echo "$x"
a,b,c
Run Code Online (Sandbox Code Playgroud)

交替

arr=(a b c)
printf -v x "%s," "${arr[@]}"
x=${x%,}
echo "$x"
a,b,c
Run Code Online (Sandbox Code Playgroud)

使用第二个选项,您可以将分隔符设置为,(逗号后跟空格)而不是,单独设置

printf -v x "%s, " "${arr[@]}"
x=${x%, }
echo "$x"
a, b, c
Run Code Online (Sandbox Code Playgroud)


Joh*_*024 6

问题是,默认情况下, echo每次调用时都会添加一个新行并sed在这些新行上进行操作。您看不到这一点,因为当 bash 处理时$(...),这些新行将转换为空格。因此,要在对您的方法进行最小更改的同时解决问题:

$ x=$(for i in a b c; do echo -n "${i}",; done| sed 's/,$//') ; echo $x
a,b,c
Run Code Online (Sandbox Code Playgroud)

该选项-n告诉echo不要添加新行。

如果您希望项目之间有空格,可以轻松添加它们:

$ x=$(for i in a b c; do echo -n "${i}, " ; done| sed 's/, $//') ;echo $x
a, b, c
Run Code Online (Sandbox Code Playgroud)


Aar*_*ies 5

另一个有用的技术是paste -s

$ arr=(a b c)
$ printf "%s\n" "${arr[@]}" | paste -sd,
a,b,c
Run Code Online (Sandbox Code Playgroud)

(注意paste -sd,这里是一个非常通用的“把这组换行分隔的项变成一个逗号分隔的列表”操作)