如何用sed精准替换JSON文件第5行指定位置的密码字符串?
解决方案:用sed精准替换JSON中password字段的内容
针对你的需求,这里有两种可靠的sed命令方案,既能精准替换password引号内的内容,又不会出现截断或重复执行变长的问题:
方案1:按固定位置替换(适合你提到的长度固定场景)
如果确定password字段在第5行,且引号内的内容从第18位到第154位(共137个字符),可以用这个命令:
sed -i '5s/^\(.\{17\}\).\{137\}/\1new-string/' file.json
命令解释:
5:仅对第5行进行操作^\(.\{17\}\):匹配行首的前17个字符(也就是"password": "这部分),并用\1捕获保存.\{137\}:匹配接下来的137个字符(即原来的password哈希值)\1new-string:将捕获的前17个字符与你的新字符串拼接,替换掉原来的匹配部分
这样执行多少次都只会替换固定长度的内容,不会破坏末尾的",结构。
方案2:按字段匹配替换(更通用,不受行号/长度限制)
如果JSON的行号可能变化,或者password长度有变动,推荐用这种基于字段模式的匹配方式,更鲁棒:
sed -i 's/"password": "[^"]*"/"password": "new-string"/' file.json
命令解释:
"password": "[^"]*":匹配"password": "开头,后面跟着任意非引号字符([^"]*),直到结尾的引号,这正好覆盖了整个password字段的内容- 替换部分
"password": "new-string"直接替换成带新密码的字段格式
这种方式不需要关心行号或原密码长度,只要字段格式正确就能精准替换。
为什么你的原命令会出问题?
你之前用的sed -i 5s/./new-string/18 file.json存在两个关键问题:
- 语法逻辑错误:
/./是匹配单个字符,/18是指定替换第18次匹配的单个字符,这会把第18个字符替换成new-string(多字符),导致行内容被拉长 - 没有限定替换范围:既没有指定要替换的字符数量,也没有保留末尾的
",,所以会破坏原有JSON结构
内容的提问来源于stack exchange,提问作者Bogdan Stoica
相关产品推荐
相关产品推荐

