Portable unix way to join strings with separator

stringsunix-shell

Is there a portable unix shellscripting way of joining a number of strings together with a given separator, like so:

$ strjoin --- foo bar baz quux
foo---bar---baz---quux

Sure I could use a $scripting_language one liner or an ugly explicit loop in a shellscript function, but the unix hackers of old probably had some need for this as well, so someone has made a standard command like this that I don't know about somewhere in the past, right?

edit

The sed method is certainly the easiest one in many situations, but it doesn't work if the strings can contain spaces. And many of the other answers also don't handle that. Are there any solutions other than the $IFS trick that handle spaces (and all possible characters in general) and do not require writing a full loop?

Best Answer

For multi-character long separator, you can use:

  • sed (as already pointed by @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 (but it will show the extra ending separator)

    $ printf "%s---" foo bar baz quux
    
  • using the following shell function (as per this SO post):

    join_by { local IFS="$1"; shift; echo "$*"; }
    

    Usage:

    $ join_by '---' foo bar baz quux
    

For one-character long separators, you can use:

  • tr

    echo foo bar baz quux | tr ' ' '-'
    
Related Topic