是否有一个可移植的unix shellcripting方式将多个string与给定的分隔符连接在一起,如下所示:
$ strjoin --- foo bar baz quux foo---bar---baz---quux
当然,我可以在shell脚本中使用$ scripting_language或者一个丑陋的显式循环,但是旧的unix黑客可能也有这个需求,所以有人做了一个我不知道的标准命令在过去的某个地方,对吗?
编辑
在许多情况下, sed方法当然是最简单的方法,但是如果string可以包含空格,那么它不起作用。 而其他许多答案也没有处理。 除了处理空格(以及所有可能的字符)的$IFS技巧之外,是否还有解决scheme,而不需要编写一个完整的循环?
对于多字符长分隔符,您可以使用:
sed (正如@Mark指出的那样 )
$ echo foo bar baz quux | sed "s/ /---/g"
ex
$ echo foo bar baz quux | ex +"s/ /---/gp" -cq! /dev/stdin $ ex +"s/ /---/gp" -scq! <(echo foo bar baz quux)
printf (但会显示额外的结尾分隔符)
$ printf "%s---" foo bar baz quux
使用下面的shell函数(按照这个SOpost ):
join_by { local IFS="$1"; shift; echo "$*"; }
用法:
$ join_by '---' foo bar baz quux
对于单字符分隔符,您可以使用:
tr
echo foo bar baz quux | tr ' ' '-'
除了@ embobo的评论(这将有望尽快成为一个答案), perl可以用来拆分和连接任意string。 这比使用sed更复杂,基于上面的例子将是主要的矫枉过正。
awk版本:
function join(a, start, end, sep, result, i) { sep = sep ? sep : " " start = start ? start : 1 end = end ? end : sizeof(a) if (sep == SUBSEP) # magic value sep = "" result = a[start] for (i = start + 1; i <= end; i++) result = result sep a[i] return result }
用gawk来调用它--source是你的string:
$ gawk -f join.awk --source 'BEGIN { split("foo bar quux",a); print join(a,1,3,"---") }' foo---bar---quux
Shell脚本版本:
function join() { for i in "$@"; do echo -n "$i""---" done echo } join foo bar baz quux
调用它并修剪最后一个分隔符:
$ ./join.sh | sed 's/\-\-\-$//' foo---bar---baz---quux
对于简单的操作, Perl并不复杂:
$ perl -e 's/ /---/g'