如何在Bash脚本中用正则为指定MIME类型行添加charset=utf-8
解决Bash中用sed给text类型MIME行添加charset=utf-8的问题
需要处理配置文件,在mimetype.assign代码块内,为所有包含text/xxx格式的行添加charset=utf-8(已存在则跳过),最终格式统一为text/xxx; charset=utf-8。之前的sed命令存在重复添加、格式错误的问题,比如已包含charset的行被重复修改,输出出现多余的charset=utf-8",。
正确的sed命令
sed '/mimetype.assign/,/)/ { /text\// { /charset=utf-8/! s/\("text\/[^"]*"\)\(,\)/\1; charset=utf-8\2/ } }' your_config_file.conf
如果需要直接修改原文件(建议先备份),添加-i参数生成备份文件后修改:
sed -i.bak '/mimetype.assign/,/)/ { /text\// { /charset=utf-8/! s/\("text\/[^"]*"\)\(,\)/\1; charset=utf-8\2/ } }' your_config_file.conf
命令逻辑说明
- 范围限定:
/mimetype.assign/,/)/仅处理从mimetype.assign起始行到闭合)的代码块,避免修改配置中无关内容。 - 目标行筛选:
/text\//只匹配包含text/的MIME类型行。 - 排除已处理行:
/charset=utf-8/!对不包含charset=utf-8的行执行替换操作,避免重复添加。 - 精准替换:
\("text\/[^"]*"\)捕获双引号内的text/xxx完整内容([^"]*匹配除双引号外的所有字符,确保只定位MIME类型部分)。\(,\)捕获行尾的逗号。\1; charset=utf-8\2将两部分捕获内容拼接,插入; charset=utf-8,保证最终格式为"text/xxx; charset=utf-8",。
效果验证
处理待配置片段后,结果如下:
## MimeType handling ## ------------------- ## ## Use the "Content-Type" extended attribute to obtain mime type if ## possible ## mimetype.use-xattr = "disable" ## ## mimetype mapping ## mimetype.assign = ( ".ogg" => "application/ogg", ".wav" => "audio/x-wav", ".gif" => "image/gif", ".css" => "text/css; charset=utf-8", ".html" => "text/html; charset=utf-8", ... )
- 已包含
charset=utf-8的.css行无变化。 - 原
.html行成功添加charset=utf-8,格式完全符合要求。 - 非text类型的行不受任何影响。
之前错误的核心原因
- 未添加排除已包含
charset=utf-8行的逻辑,导致重复插入内容。 - 正则表达式捕获范围不精准,错误匹配了额外的引号、逗号等字符,引发格式混乱。
内容的提问来源于stack exchange,提问作者KBriz
相关产品推荐
相关产品推荐

