可移植的unix方式与分隔符连接string

是否有一个可移植的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'