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)
问题是,默认情况下, 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)
另一个有用的技术是paste -s
:
$ arr=(a b c)
$ printf "%s\n" "${arr[@]}" | paste -sd,
a,b,c
Run Code Online (Sandbox Code Playgroud)
(注意paste -sd,
这里是一个非常通用的“把这组换行分隔的项变成一个逗号分隔的列表”操作)
归档时间: |
|
查看次数: |
18452 次 |
最近记录: |