Bash 加入列表
Bash to join a list
如何使用 shell 脚本和工具以正确的分隔符加入列表?
例如,给定,
$ seq 3
1
2
3
seq 3 | list_join
将产生 1,2,3
,没有尾随 ,
。
seq
只是一个样本输入,实际输入可以来自任何地方 并且输入 content/format 不应该有任何假设,除了每个都以新行结尾。
更新:
我要求 "shell 脚本和工具" 所以我接受当前的 shell 脚本 解决方案,虽然我个人会使用Fravadona的解决方案:
$ jot -w 'Entry %c' 5 'A' | tee /dev/tty | paste -s -d ','
Entry A
Entry B
Entry C
Entry D
Entry E
Entry A,Entry B,Entry C,Entry D,Entry E
对于 single-character 分隔符,一个相当简单的方法是将项目收集到一个数组中,然后扩展数组并将 IFS
设置为分隔符。
例如,对于从标准输入读取行形式的输入,并将结果写入标准输出,你可以这样做:
list_join() {
local IFS
local -a items
mapfile -t items
IFS=,
printf %s "${items[*]}"
}
演示:
$ seq 3 | list_join
1,2,3
$
相同的技术适用于从其他来源输入和输出到其他目的地,但细节 (mapfile
/ printf
) 需要调整。要点是 IFS
和数组扩展 ("${items[*]}"
).
如何使用 shell 脚本和工具以正确的分隔符加入列表?
例如,给定,
$ seq 3
1
2
3
seq 3 | list_join
将产生 1,2,3
,没有尾随 ,
。
seq
只是一个样本输入,实际输入可以来自任何地方 并且输入 content/format 不应该有任何假设,除了每个都以新行结尾。
更新:
我要求 "shell 脚本和工具" 所以我接受当前的 shell 脚本 解决方案,虽然我个人会使用Fravadona的解决方案:
$ jot -w 'Entry %c' 5 'A' | tee /dev/tty | paste -s -d ','
Entry A
Entry B
Entry C
Entry D
Entry E
Entry A,Entry B,Entry C,Entry D,Entry E
对于 single-character 分隔符,一个相当简单的方法是将项目收集到一个数组中,然后扩展数组并将 IFS
设置为分隔符。
例如,对于从标准输入读取行形式的输入,并将结果写入标准输出,你可以这样做:
list_join() {
local IFS
local -a items
mapfile -t items
IFS=,
printf %s "${items[*]}"
}
演示:
$ seq 3 | list_join
1,2,3
$
相同的技术适用于从其他来源输入和输出到其他目的地,但细节 (mapfile
/ printf
) 需要调整。要点是 IFS
和数组扩展 ("${items[*]}"
).