如何使用sed替换JSON文件指定行的变量值?
使用sed修改JSON文件指定行的可变键值
针对你要修改my.json第3行中"group-1"为变量$username值的需求,这里有几个实用的sed方案:
基础方案(匹配固定格式的键值)
如果目标行的格式固定为"name": "group-1",,可以直接用以下命令替换引号内的内容:
sed -i "3s/\"group-[0-9]*\"/\"$username\"/" my.json
命令解释:
-i:直接在原文件上修改(in-place编辑),注意macOS系统的sed需要写成-i '',否则会自动生成备份文件。3:明确指定只操作第3行,避免影响其他行。s/old/new/:sed的替换核心语法,这里用"group-[0-9]*"匹配类似"group-1"、"group-123"这类格式的字符串,替换为"$username"(双引号包裹命令才能让shell解析变量)。
更通用的方案(匹配任意键值内容)
如果"name"后面的内容不一定是group-xxx,而是任意字符串,用这个更稳妥:
sed -i "3s/\"name\": \"[^\"]*\"/\"name\": \"$username\"/" my.json
这里"[^\"]*"表示匹配引号内的任意内容,不管原来的值是什么,都会替换成$username的值。
处理含特殊字符的用户名
如果$username里包含/这类sed默认的分隔符,会导致命令出错,换用其他分隔符(比如#)即可:
sed -i "3s#\"name\": \"[^\"]*\"#\"name\": \"$username\"#" my.json
额外提示:复杂JSON推荐用jq
虽然sed能解决单行修改的需求,但如果你的JSON结构复杂,更推荐用专门的JSON处理工具jq,它能避免文本匹配带来的意外问题:
# 假设第3行是JSON数组的第三个元素(索引从0开始) jq --arg user "$username" '.[2].name = $user' my.json > temp.json && mv temp.json my.json
内容的提问来源于stack exchange,提问作者ikask
相关产品推荐
相关产品推荐

