Python密码文件修改:正则匹配问题及实现方案咨询
解决方案:匹配指定DB行+文件修改方案评估
一、修复正则匹配逻辑,支持指定DB名匹配
1. 命令行参数判断
先处理输入参数:若存在位置参数$1,则将其作为目标DB名;默认使用*作为匹配前缀。
2. 适配两种场景的正则
针对两种情况构造匹配规则:
- 无参数时:匹配
^\*:DB_USR=(转义*避免正则通配冲突) - 有参数时:匹配
^${target_db}:DB_USR=,需给DB名加引号规避特殊字符问题
修改后的核心代码示例(以Shell脚本为例):
#!/bin/bash target_db="*" if [[ $# -eq 1 ]]; then target_db="$1" fi # 生成随机密码 new_pwd=$(openssl rand -hex 16) # 读取文件到数组 mapfile -t pwd_lines < password.conf # 构造匹配正则 if [[ "$target_db" == "*" ]]; then match_pattern="^\*:DB_USR=" else # 转义DB名中的正则特殊字符(如.、+等) escaped_db=$(printf "%s" "$target_db" | sed 's/[.[\*^$+?()|]/\\&/g') match_pattern="^${escaped_db}:DB_USR=" fi # 遍历数组修改对应行 for i in "${!pwd_lines[@]}"; do if [[ "${pwd_lines[$i]}" =~ $match_pattern ]]; then pwd_lines[$i]="${target_db}:DB_USR=${new_pwd}" # 若只需修改第一行匹配项,可添加break终止循环 # break fi done # 写回文件 printf "%s\n" "${pwd_lines[@]}" > password.conf
二、数组存储修改方案的优劣评估
1. 优点
- 直观易维护:逐行处理逻辑清晰,便于调试和扩展(如添加密码校验、多条件匹配)
- 原子性安全:修改完成后一次性写回文件,避免边读边写导致的文件损坏
- 扩展性强:后续如需增加复杂业务逻辑(如日志记录、密码强度校验),数组方案更容易实现
2. 缺点
- 内存占用:若密码文件超大(如几GB),加载到数组会消耗大量内存
- 性能损耗:小文件可忽略,但大文件场景下流式处理效率更高
3. 最优方案选择
- 小文件场景(几MB以内):数组方案是最优解,兼顾可读性与安全性
- 大文件场景:直接用
sed/awk流式修改更高效,示例:# 无参数修改*开头行 sed -i "s/^\*:DB_USR=.*/\*:DB_USR=${new_pwd}/" password.conf # 有参数修改指定DB行(注意BSD sed需加-i '') sed -i "s/^${target_db}:DB_USR=.*/${target_db}:DB_USR=${new_pwd}/" password.conf
三、期望效果验证
假设原密码文件内容:
*:DB_USR=default_pass123
TESTDB09:DB_USR=db09_pass456
TESTDB10:DB_USR=db10_pass789
执行
./update_pwd后,第一行密码被替换:*:DB_USR=8a3f9d2b7c1e6f4a5b0c9d8e7f6a5b4c
TESTDB09:DB_USR=db09_pass456
TESTDB10:DB_USR=db10_pass789执行
./update_pwd TESTDB10后,第三行密码被替换:*:DB_USR=default_pass123
TESTDB09:DB_USR=db09_pass456
TESTDB10:DB_USR=2d4f6b8a0c1e3f5d7b9a0c2e4f6d8b0a
内容的提问来源于stack exchange,提问作者LearningCpp
相关产品推荐
相关产品推荐

