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