2016-09-03 46 views
1

我知道計算器是一些例子,但因爲我需要它,他們不工作,
例如:慶典破滅陣列(串)

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 

回答

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)|("被施加到每個這些單詞上述其中)|(作爲分隔符
+0

另請檢查我的[\ [向位置參數添加前綴和後綴]]的其他答案(http://stackoverflow.com/a/38558776/ 1620779) – sjsam

+0

解決方案2不能簡單地推廣到任意分隔符 - 如果分隔符包含'%'符號怎麼辦? – Leon

+0

@Leon如果分隔符中的某個字符在格式字符串本身中有特殊含義,則可以用'%'作爲前綴。在這種情況下''%%'是你正在尋找的。 – sjsam

0

我略微固定解決方案:

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

你不需要'eval'。 –

+0

@KarolyHorvath'eval'需要保持改變的'IFS'變量對該命令的本地影響 – Leon

1

我需要任何分離器,所以我使用循環更多全球溶液:

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