首页/开发/正则与编码速查/sed 正则方言与转义差异

sed 正则方言与转义差异

sed 默认使用基础正则,分组与量词需要转义;切换扩展正则后这些写法可直接使用,替换部分的反向引用与引用符需要单独注意。不同实现对基础正则下的额外写法支持不一致,可移植脚本应显式选择语法并先输出确认再原地改写。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌​‌​‌‌​​‌‌​​‌‌​‌‌​​​‌‌​​​​‌​‌‌‌​‌‌​​‌‌​‌‌‌‌​‌‌‌​​‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

sed 正则方言与转义差异

sed 默认使用基础正则,切换到扩展正则的选项在主流实现上都存在,但两套实现对方言的处理并不一致:一种实现会在基础正则下额外接受未转义的加号、问号与竖线,另一种不接受。跨平台脚本里依赖这些额外写法就会失效,显式选择扩展正则并统一转义风格是更稳的做法。

基本信息

默认语法基础正则,分组与量词需转义
扩展语法通过选项切换,分组、量词、交替直接书写
处理模型逐行读取并应用编辑命令,默认不回写原文件
原地编辑就地改写文件,备份后缀参数在不同实现上写法不同

典型使用场景

  • 配置行改写:替换键值、注释掉某行,注意只处理匹配到的部分
  • 批量清洗:日志或清单文本的格式统一,先用输出确认再原地改写
  • 提取片段:用只打印匹配内容的组合从文本里挑出关注行
  • 批量删空行与首尾空白:结合字符类与重复符号处理
  • 多行结构处理:需要跨行时需要显式使用行缓冲相关命令,不能只靠模式

替换写法与差异

替换写法与差异
sed -E 's/([0-9]{4})-([0-9]{2})/\2\/\1/' file     # 扩展正则:分组直接写
sed 's/\([0-9]\{4\}\)/year/' file              # 基础正则:分组与量词都要转义
sed -E 's/a+/b/g' file                        # 全部替换:加全局标志
sed -E 's/a+/b/2' file                        # 只替换每行的第二处
sed -E 's/b/x/; s/c/y/' file                  # 多条命令按顺序执行
sed -n -E '/^#/!p' file                       # 只打印非注释行
sed -i.bak -E 's/x/y/g' file                  # 原地编辑并保留备份(写法因实现而异)
sed -E 's/&/and/g' file                       # 需要转义:匹配结果引用符号

方言与写法对照

项目基础正则扩展正则
分组转义后使用直接使用
区间量词转义后使用直接使用
交替转义后使用直接使用
未转义加号部分实现接受,属扩展是量词
替换中的反向引用反斜杠加序号反斜杠加序号
匹配结果引用符需转义才是字面量同左
替换部分是独立的语法区域:反向引用与匹配结果引用符在其中含义特殊,字面量需要转义;分隔符也可以换成其他字符,处理含大量斜杠的路径时能省下不少转义。
原地编辑前务必先输出确认,或使用备份后缀保留副本:行级替换的影响范围由模式决定,一旦写入错误的文件或范围,恢复成本远高于先看一眼输出。

易错点

  • 依赖实现扩展写可移植脚本:未转义的加号在另一种实现下是字面量,规则静默失效
  • 忘记切换语法却使用括号分组:模式按字面匹配,替换结果与预期完全不同
  • 替换部分忘记转义引用符:想插入字面符号却被展开为匹配结果,输出内容被改写
  • 直接原地编辑而不留备份:错误模式覆盖原文件,只能从版本控制或备份恢复
  • 把逐行模型当多行处理:跨行替换无法生效,需要显式使用缓冲相关命令

数据来源与参考

  • GNU sed 手册:正则表达式方言与替换命令
  • POSIX 标准:sed 命令与正则语法
  • BSD sed 手册:扩展正则选项与原地编辑参数差异

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/sed-regex-flavor.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌​​‌​‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌​‌​‌‌​​‌‌​​‌‌​‌‌​​​‌‌​​​​‌​‌‌‌​‌‌​​‌‌​‌‌‌‌​‌‌‌​​‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​