两个空间是什么
sed 处理每一行时默认只在模式空间(pattern space)里干活,处理完输出、再读下一行。保持空间(hold space)是一块跨行保留的暂存区,二者之间可以存取、交换与追加。正是这组操作让 sed 能做多行任务:把成对的行合并、把文件倒序输出、把连续空行压成一个、按起止标记抽取整段内容。
基本信息
| 适用平台 | Linux(GNU sed);macOS 为 BSD sed,部分转义写法不同 |
|---|---|
| 核心空间 | pattern space 保存当前处理的行,hold space 用于跨行暂存 |
| 核心命令 | h 与 H 存入、g 与 G 取回、x 交换、N 读入下一行、D 删首行重跑 |
| 常用搭配 | -n 关闭自动输出,配合 p 手动控制输出时机 |
典型使用场景
- 把成对出现的两行合并成一行,例如键与值分列在不同行
- 把整个文件倒序输出,效果等同于 tac 但可在管道中穿插其他处理
- 把连续多个空行压缩成一个,清理导出文件的排版
- 按 BEGIN、END 这类标记抽取整段内容,比按行号可靠
- 给每段内容加头尾,例如把若干行包成一段配置
常用示例
常用示例
sed 'N;s/\n/ /' file # 读入下一行并替换换行,成对合并
sed -n '1!G;h;$p' file # 倒序输出(技巧:取回、暂存、最后打印)
sed '/^$/{N;/^\n$/D}' file # 连续空行挤压成一个
sed -n '/BEGIN/,/END/p' file # 按标记抽取区间,含起止两行
sed '$!N;s/\n/\t/' file # 行尾不是最后一行时合并两行,用制表符分隔
sed -n '/^\[/,/^\]/p' app.conf # 抽取以方括号开头的配置块命令逐项读法
| 命令 | 作用 | 使用注意 |
|---|---|---|
| h / H | 把模式空间覆盖或追加写入保持空间 | H 保留原内容并加换行,挤压场景靠它 |
| g / G | 用保持空间覆盖或追加到模式空间 | G 常用来在行尾接上暂存内容 |
| x | 交换两个空间的内容 | 倒序技巧的关键一步 |
| N | 把下一行读进模式空间(换行连接) | 到文件末尾时行为与预期不同,注意边界 |
| D | 删除模式空间首行,不读新行并重新执行脚本 | 与 d 语义不同,多删行多半是这里用错 |
| p 与 -n | 手动打印与关闭自动打印 | 两者必须成对使用,否则输出会重复或消失 |
sed 一次无法看到任意多行,真正复杂的跨行替换改用支持整体读取的工具更省事,别硬拼 sed 命令。
命令顺序极其敏感:1!G;h;$p 这类写法改动任何一处结果都会变,先在几行小样本上验证再上生产文件。