与apg结合使用时,如何阻止sed中断?

我正在编写一个脚本,该脚本将自动为我安装WordPress,从而使我的生活变得更加轻松,因为我必须不断部署WordPress安装。

但是,我正在努力做到这一点,因此我永远不必与之交互,这使我无法入睡。

为了生成数据库的密码,我使用apg,然后使用sed将字符串替换为正确的密码。看起来像这样:

DOMAIN="$2"
DB_NAME_USER="$(echo $DOMAIN | sed -e 's/\.//g')"
DB_PASSWORD="$(apg -a 1 -n 1 -m 64 -d -c cl_seed -E \_\"\'\`\/\\\=)"

sed -i "s/database_name_here/$DB_NAME_USER/g" /srv/"$DOMAIN"/wp-config.php
sed -i "s/username_here/$DB_NAME_USER/g" /srv/"$DOMAIN"/wp-config.php
sed -i "s/password_here/$DB_PASSWORD/g" /srv/"$DOMAIN"/wp-config.php

替换数据库和用户名就可以了,但是当替换密码时,十次替换中有六次坏了,我最终得到这样的结果:

define('DB_PASSWORD','Ymb {X-dT〜l5Agg9q561A ^?npassword_hereD; $ U,s> mu *:f7 | BK4?oM#OH> cHgsI9GndW @〜SkBQ');

强调这个问题。与其删除“ password_here”部分并将其替换为实际密码,不如将其融合在密码中间。

我以为它可能是由apg生成的一个字符,与sed混为一谈,但是我从使用-E生成的密码中删除了很多,但仍然得到了很多。

其他替换也一样,总是涉及apg和sed。替换_PASSWORD_HERE_之类的内容有时会导致相同的问题。

有什么办法解决这个问题,还是我必须继续尝试查找导致问题的字符,然后将其添加到apg的排除列表中?还是告诉sed替换整行而不是我想要的字符串?

提前致谢!

最佳答案

You need to escape the \, / and & characters in your input otherwise sed acts upon them. Something like

DB_PASSWORD=$(echo "$DB_PASSWORD" | sed -e 's/[\/&]/\\&/g')
sed -i "s/password_here/$DB_PASSWORD/g" /srv/"$DOMAIN"/wp-config.php

应该可以。