如何将分组配置格式转换为大写前缀键值对?(Bash/Python实现)
最优方案选择:Bash vs Python 配置格式转换
嘿,这个配置格式转换需求两种方式都能实现,但得看你的使用场景来选最顺手的:如果只是一次性轻量转换,用Bash+Awk会更简便,无需额外依赖;如果需要可维护性或复杂扩展,Python会更合适。先给你上两种方案的具体实现:
方案1:Bash + Awk(轻量快捷)
Awk天生擅长这种结构化文本处理,一行命令就能搞定,直接在终端运行就行:
awk ' /^\[.*\]$/ { # 提取section名,把点替换成下划线,转大写 gsub(/^\[|\]$/, "", $0) section = toupper($0) gsub(/\./, "_", section) next } /=/ { # 分割key和value,转key为大写并替换点为下划线,清理空格 split($0, kv, "=") key = toupper(kv[1]) gsub(/\./, "_", key) gsub(/ /, "", key) gsub(/ /, "", kv[2]) print section "_" key "=" kv[2] } ' input_file.txt
逻辑拆解:
- 匹配
[xxx]开头的行,提取section名称,把.换成_后转大写保存 - 匹配包含
=的行,分割出key和value,分别清理空格、转大写、替换.为_,最后拼接section和key输出完整键值对
方案2:Python(灵活可扩展)
如果后续需要处理更复杂的格式(比如嵌套section、注释、异常处理),Python的可读性和扩展性更好,写个简单脚本即可:
import re # 定义正则匹配规则 section_pattern = re.compile(r'^\[(.*)\]$') kv_pattern = re.compile(r'^\s*(\S+)\s*=\s*(.*)\s*$') current_section = "" with open('input_file.txt', 'r') as f: for line in f: line = line.strip() if not line: continue # 匹配section行 sec_match = section_pattern.match(line) if sec_match: current_section = sec_match.group(1).replace('.', '_').upper() continue # 匹配key-value行 kv_match = kv_pattern.match(line) if kv_match: key = kv_match.group(1).replace('.', '_').upper() value = kv_match.group(2) print(f"{current_section}_{key}={value}")
选Python的理由:
- 正则表达式处理更灵活,能轻松应对各种边缘情况(比如行内的多余空格)
- 后续要加功能(比如写入输出文件、批量处理多文件、过滤特定section)改起来更方便
- 代码可读性高,团队里其他成员更容易理解和维护
最终选择建议:
- 临时转文件、快速验证:直接用Bash+Awk的一行命令,打开终端就能跑,不用额外写脚本文件
- 集成自动化流程、需要长期维护:选Python更靠谱,扩展性和可维护性更强
内容的提问来源于stack exchange,提问作者DevOpsAddict
相关产品推荐
相关产品推荐

