如何用sed更稳健地修改key=value格式的配置文件?
更稳健的配置项修改方案
针对你遇到的sed命令依赖精确空格的问题,这里提供两种不依赖固定空格数量的实现方式:
改进版sed命令
利用正则匹配任意数量的空白字符(空格/制表符),不管配置项和等号之间有多少空格,都能精准匹配并修改:
单个配置项修改命令
- 修改INPUT的值:
sed -i 's/^\s*INPUT\s*=.*/INPUT = something/' doxygen.conf - 将RECURSIVE设为YES:
sed -i 's/^\s*RECURSIVE\s*=.*/RECURSIVE = YES/' doxygen.conf - 将GENERATE_LATEX设为NO:
sed -i 's/^\s*GENERATE_LATEX\s*=.*/GENERATE_LATEX = NO/' doxygen.conf
兼容性说明
如果你的sed版本不支持\s(比如部分非GNU sed环境),可以用[[:space:]]*替代\s*,示例:
sed -i 's/^[[:space:]]*INPUT[[:space:]]*=.*/INPUT = something/' doxygen.conf
正则各部分作用:
^\s*:匹配行首的任意空白字符(避免匹配注释或其他行中包含INPUT的内容)INPUT:精确匹配配置项名称\s*=:匹配等号前后的任意空白字符.*:匹配原来的所有值内容,替换成你需要的新值
批量修改的awk方案
如果需要一次性修改多个配置项,awk会更灵活,无需写多条命令:
awk -v conf="INPUT=something RECURSIVE=YES GENERATE_LATEX=NO" ' BEGIN { split(conf, arr, " ") for (i in arr) { split(arr[i], kv, "=") map[kv[1]] = kv[2] } } /^\s*[A-Z_]+/ { if ($1 in map) { $0 = $1 " = " map[$1] } } 1' doxygen.conf > temp.conf && mv temp.conf doxygen.conf
这个命令会:
- 先把要修改的配置项存入映射表
- 遍历配置文件,匹配以空白+大写字母/下划线开头的配置行
- 如果该行的配置项在映射表里,就替换成新的键值对
- 最后将修改后的内容写入临时文件,再替换原文件(避免直接修改导致文件损坏)
内容的提问来源于stack exchange,提问作者new born
相关产品推荐
相关产品推荐

