bash implode数组(到字符串)

时间:2016-09-03 09:50:51

标签: arrays bash implode

我知道stackoverflow中有一些例子,但它们并不像我需要的那样工作,
例如:

separator=")|("
foo=('foo bar' 'foo baz' 'bar baz')
regex="${foo[@]/#/$separator}"
regex="${regex:${#separator}}" # remove leading separator
echo "${regex}"

#output: foo bar )|(foo baz )|(bar baz

我想得到:

#output: foo bar)|(foo baz)|(bar baz

3 个答案:

答案 0 :(得分:2)

我需要更多的全局解决方案,所以我使用循环:

varReturn=""

implode () { 
    local separator
    separator="$1"

    #local foo
    #foo=('foo bar' 'foo baz' 'bar baz')

    local array
    array=("${!2}")

    local newString
    newString=""
    for element in "${array[@]}"
    do
        newString="$newString$separator$element"
    done
    newString="${newString:${#separator}}"
    #echo "line $LINENO: ${newString}"
    varReturn="$newString"

    return 0
}
arr=("abc cba" 2 "tree" "z%s")
sep=")%s("
implode "$sep" arr[@]
result="$varReturn"
echo "line $LINENO: $result" #line 65: abc cba)%s(2)%s(tree)%s(z%s

答案 1 :(得分:1)

希望这会有所帮助:

解决方案1 ​​

$ foo=('foo bar' 'foo baz' 'bar baz')
$ foo=( "${foo[@]/%/)|(}" ) #appending ')|('
$ i="${#foo[@]}" #Taking array count.
$ i=$(( i - 1 )) #i points to the final array element
$ foo[$i]="${foo[$i]%)|(}" # Removing ')|(' attached to the final element
$ final="${foo[*]}" # storing array as string with space separated values 
$ final="${final//\( /(}" #stripping the whitespace after '('
$ $ echo "$final" # and that is your result.
foo bar)|(foo baz)|(bar baz 

解决方案2

好的,这是一个更简单的解决方案,我想

$ foo=('foo bar' 'foo baz' 'bar baz')
$ final="$(printf "%s)|(" "${foo[@]}")"
$ final="${final%)|(}"
$ echo "$final"
foo bar)|(foo baz)|(bar baz

注意

printf "%s)|(" "${foo[@]}"我需要一个解释,所以这里是

  • "${foo[@]}"将数组中的每个值扩展为单独的单词。
  • printf "%s)|("适用于)|(作为分隔符的上述每个字词

答案 2 :(得分:0)

我稍微修复了你的解决方案:

separator=")|("
foo=('foo bar' 'foo baz' 'bar baz')
IFS='' eval 'regex="${foo[*]/#/$separator}"'
regex="${regex:${#separator}}" # remove leading separator
echo "${regex}"