Skip to content

Replace placeholders from an associative array

Substitute each key in a nameref map with its value inside a file.

18th August 2026

ref_array() {
  local varname="$1"
  local export_as="$2"
  local code

  code=$(declare -p "$varname")
  echo "${code/$varname/$export_as}"
}

replace_variables() {
  eval "$(ref_array "$1" array)"
  filename="${2}"

  local i search replace

  # shellcheck disable=SC2154
  for i in "${!array[@]}"; do
    search="${i}"
    replace="${array[$i]}"

    if grep -q "${search}" "${filename}"; then
      sed -i '' "s/${search}/${replace}/g" "${filename}"
      printf "Replaced %s with %s\n" "${search}" "${replace}"
    fi
  done
}

Caveats

sed -i '' is the macOS in-place form. On GNU sed use sed -i. Keys are used as regexes.