如何用sed通过变量替换JSON中的version字段值
解决sed替换JSON版本时变量不解析的问题
这问题我之前调试脚本时也踩过坑!核心原因是你用单引号包裹了sed命令——在Bash里,单引号内的所有内容都会被当作纯字面量,$符号不会被解析成变量引用,所以才会直接输出$newvalue而不是你想要的变量值。
给你几个可行的解决方案:
方案1:改用双引号包裹sed命令
把sed命令的单引号换成双引号,这样Bash会先解析里面的变量,再传给sed执行:
newvalue="1.0.0" echo '{"version":"0.5363"}' | sed "s/\({\"version\":\"\)[^\"]*\(\"}\)/\1$newvalue\2/g"
注意:双引号里的内部双引号要加反斜杠转义(\"),避免和外层双引号冲突。
方案2:单引号拼接变量
如果习惯用单引号写sed命令,可以把变量部分单独用双引号包裹,和前后的单引号内容拼接起来:
newvalue="1.0.0" echo '{"version":"0.5363"}' | sed 's/\({"version":"\)[^"]*\("}\)/\1'"$newvalue"'\2/g'
这里sed命令被拆成了三部分:'s/\({"version":"\)[^"]*\("}\)/\1' + "$newvalue" + '\2/g',Bash会自动把它们拼接成完整的命令,同时解析变量。
更稳妥的方案:用jq处理JSON
sed本质是文本处理工具,用来修改JSON容易因为格式变化(比如键值对之间加了空格)出错。如果你的环境能安装jq(专门的JSON处理工具),更推荐这种方法:
newvalue="1.0.0" echo '{"version":"0.5363"}' | jq --arg v "$newvalue" '.version = $v'
--arg参数用来传递变量,.version = $v直接修改JSON的version字段,完全不用担心格式问题,比sed靠谱得多。
内容的提问来源于stack exchange,提问作者sush
相关产品推荐
相关产品推荐

