You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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类型的行不受任何影响。

之前错误的核心原因

  1. 未添加排除已包含charset=utf-8行的逻辑,导致重复插入内容。
  2. 正则表达式捕获范围不精准,错误匹配了额外的引号、逗号等字符,引发格式混乱。

内容的提问来源于stack exchange,提问作者KBriz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:57:06