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

如何用sed与正则表达式在Bash中实现双引号字符串语法高亮?

用sed高亮Bash脚本中的双引号字符串

嘿,我来帮你搞定这个sed正则的问题!要实现双引号包裹内容的高亮,核心是写出能准确捕获引号间文本的正则,还要兼顾sed的语法特性——下面分两种场景给你解决方案:

基础版本(无转义双引号的场景)

如果你的脚本里没有转义的双引号(比如"he said \"hello\""这种带反斜杠的情况),用这个简单的命令就够了:

sed -E 's/"([^"]*)"/\x1b[93m"\1"\x1b[39m/g' /tmp/your_script.sh

正则拆解:

  • -E:启用扩展正则表达式,让语法更简洁直观
  • s/"([^"]*)"/.../g:全局替换所有匹配项
    • ":匹配开头的双引号
    • ([^"]*):捕获组,匹配任意非双引号的字符([^"]是反向字符集,*表示0个或多个),捕获的内容会存在\1里
    • ":匹配结尾的双引号
  • 替换部分\x1b[93m"\1"\x1b[39m:
    • \x1b是转义字符的ASCII码(和\e等价,部分sed版本不支持\e,用\x1b兼容性更好)
    • [93m:设置亮黄色(你要的目标颜色)
    • "\1":把捕获到的原始内容用双引号包裹
    • [39m:重置回终端默认颜色

进阶版本(处理转义双引号)

如果脚本里存在转义的双引号(比如"this is a \"quoted\" word"),上面的正则会提前终止匹配,这时候需要更灵活的正则来识别转义字符:

sed -E 's/"((\\.|[^"])*)"/\x1b[93m"\1"\x1b[39m/g' /tmp/your_script.sh

关键正则解释:

  • (\\.|[^"])*:这个捕获组会匹配两种情况:
    • \\.:匹配转义字符\加上任意字符(包括转义的双引号\")
    • [^"]:匹配非双引号的普通字符
    • *:重复匹配上述两种情况,直到遇到未转义的双引号为止

整合到你的高亮脚本建议

可以把这个逻辑封装成函数,方便和其他高亮规则(比如关键词替换)结合:

highlight_quotes() {
  local input_file="$1"
  # 先处理引号高亮,再叠加其他关键词高亮(示例中保留你的颜色逻辑)
  sed -E 's/"((\\.|[^"])*)"/\x1b[93m"\1"\x1b[39m/g' "$input_file" \
      | sed -E 's/(if|then|else|fi|for|while|do|done)/\x1b[94m\1\x1b[39m/g'
}

# 使用示例:
highlight_quotes /tmp/your_script.sh

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 07:42:36