Esta pergunta já tem uma resposta aqui:
RESOLVIDO, código atualizado abaixo: Como é possível escapar dinamicamente caracteres especiais no sed? Parece que o sed não consegue lidar com isso. Talvez haja outra abordagem para isso no entanto. A idéia é capturar uma lista de todas as conexões de banco de dados e substituir sua senha por outra senha criptografada (embora 'teste' seja usado abaixo). A / na criptografia AES, entre os outros caracteres especiais, é um problema.
#!/bin/bash
DB_USER=user
DB_HOST=hostname
DS_PATH=$HOME/dbconnects
DS_FILELIST=('grep -il '${DB_USER}\|${DB_HOST}\|password-encrypted' ${DS_PATH}')
CURRENT_PASSWD () {
for current_pass in ${ds_list}; do
# UPDATED HERE: Below I added the last pipe into sed, which escapes all the regexp operators (][.^$*), the escaping character itself (\), and the separator (/).
grep password-encrypted ${current_pass} | sed 's/<password-encrypted>//;s/<\/password-encrypted>//' | awk -F ' ' '{print $1}' | sed 's/[][\/.^$*]/\&/g'
done
}
for ds_list in ${DS_FILELIST[@]}; do
echo ${ds_list}
CURRENT_PASSWD
sed --in-place "s/$(CURRENT_PASSWD)/test/g" ${ds_list}
done
Saída:
[user@hostname ~]$ ./Modify_Password.sh
/app/user/home/dbconnects/dbconnect1.xml
{AES}ikfhdgyspeuwmkC6U/s86Hf2oarifh4309ytfrRs8r+uOewsf43sfD
sed: -e expression #1, char 73: unknown option to 's'
Nova saída:
[user@hostname ~]$ ./Modify_DatasourcePassword.sh
/app/user/home/dbconnects/dbconnect1.xml
{AES}ikfhdgyspeuwmkC6U\/s86Hf2oarifh4309ytfrRs8r+uOewsf43sfD
# The / is now escaped.