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}"