首页/系统/Linux 运维命令速查/sed 保持空间与多行操作
文本处理77 条

sed 保持空间与多行操作

sed 的进阶核心:pattern space 与 hold space 配合(h/H/g/G/x/D/N),能合并行、倒序、挤压空行、按段抽取。

Linux 运维命令速查系统更新于 2026-10-13

两个空间是什么

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 这类写法改动任何一处结果都会变,先在几行小样本上验证再上生产文件。

易错点

  • D 与 d 语义不同:D 删除模式空间首行后不读新行、直接重新执行脚本,用错会造成多删行
  • 多行命令的书写顺序敏感,改动一处结果就变,必须在样本文件上验证后再批量执行
  • GNU sed 与 BSD sed 对转义与部分扩展写法支持不同,跨平台脚本要分别验证
  • 在 -i 原地替换时没有备份后缀,一次写错就覆盖了源文件,生产环境坚持加备份后缀

数据来源与参考

  • man 1 sed(GNU sed 手册)

相关工具

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