如何通过Python远程修改JSON指定字段?sed命令失效求助
问题分析与解决方案
问题原因
- 贪婪匹配导致文件不完整:你原sed命令中的
.*是贪婪匹配规则,会从"accessRights":之后一直匹配到文本末尾,把"name": "admin"等后续内容全部替换掉,直接造成文件截断。 - 转义错误与正则逻辑缺陷:原命令错误使用了HTML实体转义
\",同时正则未精准限定字段值的匹配范围,还可能因sed版本或隐式参数导致值被转为小写。
正确解决方案
方案一:使用jq(推荐,结构化JSON处理工具)
jq是专门用于JSON操作的工具,能无视JSON的格式变化(空格、换行)精准定位修改字段,是处理结构化JSON数据的标准方式。
修改后的Python代码:
def test_tc(): newUsrCfg = "F7FFF" # 用jq更新accessRights字段,输出到临时文件后替换原文件(避免直接修改出错) cmd = f'jq \'.users.accessRights = "{newUsrCfg}"\' /etc/hgp/runtime/user/user1.json > temp.json && mv temp.json /etc/hgp/runtime/user/user1.json' subprocess.call(["bash", pathToSshCommand, cmd])
如果远程设备未安装jq,可通过包管理器安装(如apt install jq或yum install jq)。
方案二:修正sed命令(仅当无法使用jq时)
通过精准正则避免贪婪匹配,同时修正转义逻辑:
def test_tc(): newUsrCfg = "F7FFF" # 用[^"]*匹配字段值(仅匹配到下一个双引号),避免过度匹配 cmd = f'sed -i \'s/"accessRights":"[^"]*"/"accessRights":"{newUsrCfg}"/g\' /etc/hgp/runtime/user/user1.json' subprocess.call(["bash", pathToSshCommand, cmd])
注意:如果远程是BSD系统(如macOS),sed的
-i选项需要指定备份后缀,比如sed -i.bak 's/.../.../' file,执行后可手动删除生成的.bak备份文件。
内容的提问来源于stack exchange,提问作者moab
相关产品推荐
相关产品推荐

