使用PyYaml更新特殊格式YAML文件的schema与upassword字段
问题原因
你当前处理的配置文件不是标准YAML格式,是类INI配置格式,所以PyYAML无法正常解析修改,直接用shell原生工具做行级匹配替换是最轻量可靠的方案,不需要额外安装依赖。
推荐方案:awk 原地更新(无特殊字符转义问题)
这个方案兼容性最好,不管你shell脚本生成的密码里包含&、%、/、@这类特殊字符,都不需要手动转义,Linux、macOS环境都能正常运行:
# 替换成你脚本生成的实际值 TARGET_SCHEMA="put" TARGET_UPASSWORD="5668guuh6y%&_jhv86@" CONF_PATH="values.conf" awk -v new_schema="$TARGET_SCHEMA" -v new_upass="$TARGET_UPASSWORD" ' BEGIN { in_first_section = 0 } # 匹配到[first]段开头,打标记 /^\[first\]$/ { in_first_section = 1 print next } # 匹配到下一个配置段开头,取消标记 /^\[/ { in_first_section = 0 } # 在[first]段内匹配到schema字段,替换为新值 in_first_section && /^schema[[:space:]]*=/ { print "schema = " new_schema next } # 在[first]段内匹配到upassword字段,替换为新值 in_first_section && /^upassword[[:space:]]*=/ { print "upassword = " new_upass next } # 其余所有行原样输出 1 ' "$CONF_PATH" > tmp_conf && mv tmp_conf "$CONF_PATH"
脚本逻辑说明:
- 仅修改
[first]配置段内的对应字段,不会误改其他段下可能存在的同名字段 - 写入时直接拼接键名和新值,不会受值内特殊字符影响
- 先写入临时文件再覆盖原文件,避免写入中途出错损坏原配置
备选方案:sed 原地更新(适合纯Linux GNU sed环境)
如果你的运行环境是标准Linux发行版,也可以用sed直接原地修改,注意替换分隔符避免和密码内的特殊字符冲突:
TARGET_SCHEMA="put" TARGET_UPASSWORD="5668guuh6y%&_jhv86@" CONF_PATH="values.conf" sed -i \ -e '/^\[first\]$/,/^\[/{s|^schema[[:space:]]*=.*|schema = '"$TARGET_SCHEMA"'|}' \ -e '/^\[first\]$/,/^\[/{s|^upassword[[:space:]]*=.*|upassword = '"$TARGET_UPASSWORD"'|}' \ "$CONF_PATH"
注意:macOS/BSD系统自带的sed不支持上述直接-i参数的写法,需要写成
sed -i ''才可以正常原地修改,跨平台场景优先选awk方案。
验证修改结果
执行完修改命令后,运行以下命令检查字段值是否符合预期:
grep -E '^(schema|upassword)[[:space:]]*=' values.conf
正常输出为:
schema = put upassword = 5668guuh6y%&_jhv86@
内容的提问来源于stack exchange,提问作者wasay
相关产品推荐
相关产品推荐

