Usar variables asignadas con el contenido de henetworkingoc en un script Bash a través de Sed

Estoy tratando de replace algunos datos de configuration en files Ansible con valores que he asignado con henetworkingoc. Los datos henetworkingoc contienen valores recuperados de Git.

El objective final es recuperar la configuration de Git y actualizar algunos files Ansible var con sus valores.

No sé cómo resolver el error

sed: -e expression #1, char 6: unterminated `s' command 

La secuencia de commands de Bash se parece a la siguiente

 update_ansible_config() { # Attempt to get the most relevant git configuration (global, local then repo) GIT_USER=$(git config user.name) GIT_EMAIL=$(git config user.email) if [ -z "${GIT_EMAIL}" ] || [ -z "${GIT_USER}" ]; then echo "Please set up your Git cnetworkingentials (User and Email)" exit 1 fi # Update the ansible vars/all.yml with the Git configuration # This is the pattern we are looking for read -r -d '' SEARCH_CONFIG <<EOF git: install: '1' user: email:.* name:.* EOF # This is the replacement read -r -d '' REPLACEMENT_CONFIG <<EOF git: install: '1' user: email: '${GIT_EMAIL}' name:. '${GIT_USER}' EOF CONFIG=test.yml # Debugging #echo "${SEARCH_CONFIG}" #echo "${REPLACEMENT_CONFIG}" set -x # Do the replacement sed -i 's/'"${SEARCH_CONFIG}"'$/'"${REPLACEMENT_CONFIG}"/ "${CONFIG}" } 

Tal vez estoy complicando demasiado el enfoque y hay una mejor alternativa. Quiero asegurarme de que solo actualizo las keys de correo electrónico y nombre cuando existen bajo las teclas de usuario git ->.

Editar –

Después de mirar la respuesta de @chridd, estoy más cerca.

El resultado de Bash ahora se ve como

 + sed -i 's/git: install: '\''1'\'' user: email:.* name:.*$/git: install: \'\''1\'\'' user: email: '\''foo@bar'\'' name: '\''Foo Bar'\''/' test.yml sed: -e expression #1, char 6: unterminated `s' command 

Todavía estoy haciendo algo incorrectamente. Además, no necesitaba usar el guión complicado para get la configuration de Git (actualizada)

El problema es donde dice $(echo "${SEARCH_CONFIG}") . echo emite una nueva línea después de su salida, lo que significa que si $SEARCH_CONFIG es "foo" y $REPLACEMENT_CONFIG es "bar", entonces el command sed está tratando de ejecutar se ve como

 s/foo /bar / 

sed interpreta esto como tres commands separados ya que son tres líneas separadas, y se queja porque s/foo no es un command completo. En este caso, el echo es innecesario; solo use ${SEARCH_CONFIG} directamente sin el echo :

  sed -i 's/'"${SEARCH_CONFIG}"/"${REPLACEMENT_CONFIG}"/ "${CONFIG}" 

Si específicamente te preocupa que esté al final de la línea, agrega un $ después de la expresión regular (asegúrate de citarla):

  sed -i 's/'"${SEARCH_CONFIG}"'$/'"${REPLACEMENT_CONFIG}"/ "${CONFIG}"