我知道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
答案 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}"