Q:

bash script load an modify array from external file

I have written a script that is reading an array: recentdirs with directory names from an external config file called: defaults.cfg and the user can either chose one of the directories from the list or enter a new one. If the user enters a new directory I want this to be stored as the first position in the array recentdirs and saved back in the config file defaults.cfg . The script is able to do this BUT in the current form it is overwriting the file defaults.cfg and thus loosing all other values I'd like to store in it. I have played with ">>" but then the array will be added to the end of the file instead of modified.
directory_select.sh
#!/bin/bash
number=0

source defaults.cfg

for i in "${recentdirs[@]}"
do
   #only show the last 5 directories
    if [ $number -le 5 ]
    then
            echo "$number - $i"
            number=$((number+1))
    else
            break
    fi
done

read selection

#check if number or string was entered
regpat='^[0-9]+$'
if ! [[ $selection =~ $regpat ]]
then
    newdir=( ${selection} )

    #merge arrays to have the new entry at the first position
    recentdirs=("${newdir[@]}" "${recentdirs[@]}")

    #write array back into file
    set | grep ^recentdirs > defaults.cfg
else
    echo ${recentdirs[$selection]}
fi

Content of defaults.cfg
recentdirs=([0]="/new/folder/" [1]="/folderA/folder1/" [2]="/folderB/folder2/" [3]="/folderX/folder5")

EDIT
Working version:
#!/bin/bash
number=0
source defaults.cfg

for i in "${recentdirs[@]}"
do
   #only show the last 5 directories
    if [ $number -le 5 ]
    then
            echo "$number - $i"
            number=$((number+1))
    else
            break
    fi
done

read selection

#check if number or string was entered
regpat='^[0-9]+$'
if ! [[ $selection =~ $regpat ]]
then
    newdir=( ${selection} )

    #merge and write array back into file with sed
    sexp="s[^recentdirs.*[recentdirs=(${newdir[@]} ${recentdirs[@]})["
    sed -i -e "$sexp" defaults.cfg

else
    echo ${recentdirs[$selection]}
fi

A:

You should replace 
grep ^recentdirs > defaults.cfg

with
sexp="s[^recentdirs.*[recentdirs=(${newdir[@]} ${recentdirs[@]})["
sed -i -e "$sexp" defaults.cfg

