GitHub Action中使用sed替换MongoDB连接字符串出现重复写入的问题求助
我在GitHub Action里执行了一段sed命令,想要把.env.production文件里的DB_URI替换成指定的MongoDB连接字符串,命令是这样的:
sed -i "s#DB_URI=.*$#DB_URI=mongodb+srv://xxxxxx:xxxxxxxx@db-mongodb-sfo3-api-discovery-f417ebf8.mongo.xxxxxxxxx.com/webapp_test?tls=true&authSource=admin&replicaSet=db-mongodb-sfo3-api-discovery#"
但执行后发现.env.production里的DB_URI出现了重复写入的情况,最终内容变成了这样:
DB_URI=***db-mongodb-sfo3-api-discovery-f417ebf8.mongo.xxxxxxx.com/webapp_test?tls=trueDB_URI=***db-mongodb-sfo3-api-discovery-f417ebf8.mongo.xxxxxx.com/webapp?tls=true&authSource=admin&replicaSet=db-mongodb-sfo3-api-discoveryauthSource=adminDB_URI=***db-mongodb-sfo3-api-discovery-f417ebf8.mongo.xxxxxx.com/webapp?tls=true&authSource=admin&replicaSet=db-mongodb-sfo3-api-discoveryreplicaSet=db-mongodb-sfo3-api-discovery
有没有大佬能帮我看看怎么解决这个重复写入的问题?
问题分析&解决方案
我之前遇到过类似的坑,大概率是这两个原因导致的:
连接字符串里的特殊字符未转义
你的MongoDB连接字符串包含&符号,在shell环境中&是后台执行命令的分隔符,sed解析时会把它当成命令结束标记,导致替换内容被截断,后续的authSource=admin等内容被错误拼接,最终出现重复写入的混乱结果。sed命令未指定目标文件
你写的sed命令末尾没有明确指定要操作的.env.production文件,如果没指定目标文件,sed会默认从标准输入读取内容再输出到标准输出,要是GitHub Action环境里有其他输入流干扰,也可能触发重复写入的问题。
给你两个亲测有效的解决办法:
方法一:转义特殊字符并指定目标文件
把连接字符串里的&转义成\&,同时在命令末尾加上目标文件名.env.production,修改后的命令如下:
sed -i "s#DB_URI=.*$#DB_URI=mongodb+srv://xxxxxx:xxxxxxxx@db-mongodb-sfo3-api-discovery-f417ebf8.mongo.xxxxxxxxx.com/webapp_test?tls=true\&authSource=admin\&replicaSet=db-mongodb-sfo3-api-discovery#" .env.production
方法二:用单引号包裹替换内容
单引号在shell中不会解析特殊字符,这样就不用手动转义&了,命令改成:
sed -i 's#DB_URI=.*$#DB_URI=mongodb+srv://xxxxxx:xxxxxxxx@db-mongodb-sfo3-api-discovery-f417ebf8.mongo.xxxxxxxxx.com/webapp_test?tls=true&authSource=admin&replicaSet=db-mongodb-sfo3-api-discovery#' .env.production
另外建议你在执行sed命令前,先打印.env.production的内容确认初始DB_URI格式是否正常,避免原文件里存在多个DB_URI行导致多次替换。
备注:内容来源于stack exchange,提问作者DevOPs

