Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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

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?

share|improve this question
sed 's/ /---/g' Why would you need a separate utility? – Mark Wagner Sep 15 '11 at 17:25
@embobo Post it as an answer and earn some free rep... – voretaq7 Sep 15 '11 at 18:40

In addition to @embobo's comment (which will hopefully make it into an answer soon), perl can be used to split and join arbitrary strings. This is more complex than using sed and based on the example above would be major overkill.

share|improve this answer

awk version:

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

Call it with gawk with --source is your strings:

$ gawk -f join.awk --source 'BEGIN { split("foo bar quux",a); print join(a,1,3,"---") }'

Shell script version:

function join() {
    for i in "$@"; do
        echo -n "$i""---"

join foo bar baz quux 

Call it and trim the last separator:

$ ./ | sed 's/\-\-\-$//'
share|improve this answer

Perl is not that complex for simple operations:

$ perl -e 's/ /---/g'
share|improve this answer
Considering OP wants to join parameters, that'd be perl -E 'say join(shift, @ARGV)' -- delim str1 str2 str3 ... The perl one-liner you've posted doesn't actually do anything (well, it changes $_, but that isn't passed into or out of the one liner). You probably wanted to pass -p as well. – derobert Sep 15 '11 at 20:09

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.