Shell脚本使用sed替换JSON文件中URL变量失败问题求助
问题原因
- 你选择
+作为sed替换命令的分隔符,MongoDB连接串中包含+字符时会被sed误判为替换命令结束标记,导致替换规则被截断。 - MongoDB连接串的参数默认用
&分隔,sed中&是特殊关键字,会被解析为「替换为匹配到的原行内容」,这是你看到原"uri": "MONGO_URI"重复残留的直接原因。 - 硬编码行号30的替换逻辑非常脆弱,JSON调整缩进、增减行后会出现替换错位问题。
修复方案
方案1:sed适配特殊字符替换(无需额外工具)
先转义变量中的sed特殊字符,再更换不会冲突的分隔符,同时按字段内容匹配替换行,避免硬编码行号:
# 转义变量中的&、\、/等sed特殊字符 ESCAPED_URI=$(printf '%s\n' "$MONGO_URI" | sed 's/[\/&]/\\&/g') # 执行替换,使用#作为分隔符 sed -i '/^[[:space:]]*"uri":[[:space:]]*"MONGO_URI"/s#"uri":.*#"uri": "'"$ESCAPED_URI"'",#' temp.json
方案2:使用jq工具替换(推荐,无特殊字符兼容问题)
使用JSON专用处理工具jq可以完全规避sed的特殊字符问题,且精准匹配JSON字段,不受格式、缩进、换行影响:
# Debian/Ubuntu 环境安装jq apt update && apt install -y jq # 直接替换requestsDB下的uri字段值 jq --arg mongo_uri "$MONGO_URI" '.requestsDB.uri = $mongo_uri' temp.json > temp.json.tmp && mv temp.json.tmp temp.json
内容的提问来源于stack exchange,提问作者Radonusername
相关产品推荐
相关产品推荐

