sed是独立的流编辑器,所有操作在内存中逐行完成,无需依赖awk或grep;通过管道可衔接其他工具各司其职,其保持空间(hold space)支持跨行处理,性能优于awk做简单替换。

sed 本身不“结合”其他流编辑器在内存中协同工作——它本身就是专为流式处理设计的独立工具,所有操作都在内存中逐行完成,无需依赖或串联其他流编辑器(比如 awk 或 grep)来实现清洗与转化。所谓“结合”,实际是通过管道(|)把多个命令按需衔接,各自负责一段逻辑,数据以行为单位在线流动,全程不落地、不写磁盘,自然就在内存中完成清洗与转化。
sed 自身就能完成多数清洗与转化任务
它不是辅助工具,而是主力编辑器:一次读入一行到模式空间,执行替换(s)、删除(d)、插入(i/a)、提取(-n + p)、跨行处理(N、h/g/x 等)等操作,再输出。整个过程不依赖 awk 或 grep——例如:
- 删空行:
sed '/^$/d' file - 去首尾空白:
sed 's/^[[:space:]]*//; s/[[:space:]]*$//' - 提取 IPv4 地址(含简单校验):
sed -n 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p'
用管道衔接其他工具时,各司其职
当清洗逻辑复杂(如需字段切分、数值计算、状态累积),才引入 awk;当只需快速过滤行,可前置 grep。但注意:grep 和 awk 并非“和 sed 共享内存”,它们各自维护自己的缓冲区,管道只是把前者的 stdout 当作后者的 stdin,本质仍是单向流传递:
- 先过滤再替换:
grep 'ERROR' app.log | sed 's/\[.*\]//g' - 先清理再结构化:
sed 's/^[[:space:]]*//; s/[[:space:]]*$//' data.csv | awk -F',' '{print $1,$3}' - 避免冗余调用:能用 sed 完成的过滤(如
/pattern/d),就不必加 grep,减少进程开销
真正需要“多缓冲协同”时,用 sed 内置保持空间
sed 的 hold space 就是为跨行逻辑设计的内存暂存区,无需外部工具介入。典型场景:
- 合并连续的非空行:
sed '/^$/!{H;$!d;}; x;s/\n/ /g;s/^ //' - 倒序输出两行:
sed -n '/First/{h;n;p;g;p;}' file(用 h/g 在模式空间与保持空间间搬运) - 匹配块(如 XML 标签对):靠 N 命令读多行 + 保持空间暂存起始标记
性能与安全提醒
所有流式操作默认不修改原文件,输出走 stdout。若要落地,用重定向 > 或 -i(慎用,建议加备份后缀如 -i.bak)。大文件处理时,避免用 awk 做简单替换(sed 更轻量),也避免在管道中无谓增加进程(比如 cat file | sed ... 属反模式,直接 sed ... file 即可)。

















