我正在处理一种情况,我需要将数组中的逗号分隔列表创建到定界符中并删除最后一个逗号。我正在使用 bashfor
管道来sed
删除所有逗号而不是最后一个。一个简化的例子如下:
x=$(for i in a b c; do echo "${i}",; done| sed 's/,$//')
echo $x
a b c
期望的输出:
a, b, c
任何建议表示赞赏。
答案1
一种选择是坚持bash
arr=(a b c)
x=$(IFS=,;printf "%s" "${arr[*]}")
echo "$x"
a,b,c
交替
arr=(a b c)
printf -v x "%s," "${arr[@]}"
x=${x%,}
echo "$x"
a,b,c
使用第二个选项,您可以将分隔符设置为,
(逗号后跟空格)而不是,
单独设置
printf -v x "%s, " "${arr[@]}"
x=${x%, }
echo "$x"
a, b, c
答案2
另一种有用的技术是paste -s
:
$ arr=(a b c)
$ printf "%s\n" "${arr[@]}" | paste -sd,
a,b,c
(注意,paste -sd,
这里是一个非常通用的“将这组换行符分隔的项转换为逗号分隔的列表”操作)
答案3
问题是,默认情况下, echo
每次调用它时都会添加一个新行,并sed
在这些新行上进行操作。您看不到这一点,因为当 bash 处理 时$(...)
,这些新行将转换为空格。因此,要解决问题,同时对您的方法进行最小的改变:
$ x=$(for i in a b c; do echo -n "${i}",; done| sed 's/,$//') ; echo $x
a,b,c
该选项-n
告诉echo
您不要添加新行。
如果您希望项目之间有空格,可以轻松添加它们:
$ x=$(for i in a b c; do echo -n "${i}, " ; done| sed 's/, $//') ;echo $x
a, b, c
答案4
$ w=(a b c)
$ IFS=, eval 'echo "${w[*]}"'
a,b,c
旁注,我们不是吗 重新发明轮子 这里?