/^$/d 最安全,仅删除真正空行(行首紧接行尾、无任何字符),不处理含空格或制表符的行;预览用 sed '/^$/d' file.txt,gnu 环境原地修改用 sed -i '/^$/d' file.txt,macos 需 sed -i.bak 或 sed -i '' '/^$/d' file.txt。

只删纯空行:用 /^$/d 最安全
这个正则只匹配真正“什么都没有”的行:行首^紧接行尾$,中间零字符。它不会动含空格、制表符的行——这不是缺陷,是精准控制。
- 预览效果(不改原文件):
sed '/^$/d' file.txt - 原地修改(GNU sed):
sed -i '/^$/d' file.txt - 批量处理多个文件:
sed -i '/^$/d' *.log *.conf - 注意:
-i在 macOS(BSD sed)上必须带备份后缀,比如sed -i.bak '/^$/d' file.txt
要删“空白行”(含空格/Tab):必须升级正则
很多日志或配置文件里的“空行”其实藏着空格或\t,/^$/d完全无效。这时得用能匹配空白字符的写法。
- GNU sed 推荐:
sed '/^[[:space:]]*$/d' file.txt - macOS 默认 sed 不支持
[[:space:]],改用:sed '/^[ \t]*$/d' file.txt(显式列出空格和 tab) - 如果连换行符也算空白(极少见),
[[:space:]]更全面;但日常场景中[ \t]已覆盖 99% 的缩进残留
为什么不用 grep -v '^$'?
grep -v '^$' 确实也能过滤纯空行,但它本质是“打印非空行”,不是“编辑流”。问题在于:
- 它无法处理空白字符——
grep -v '^[[:space:]]*$'在部分老版本 grep 中不支持[[:space:]] - 管道链过长时(比如
grep | sed | awk),性能不如单条sed命令直接处理 - 想原地修改就得套 shell 重定向组合(如
grep -v '^$' file > tmp && mv tmp file),比sed -i多两步且有竞态风险
容易被忽略的坑:-i 选项的跨平台差异
sed -i 看似方便,但 GNU 和 BSD 实现完全不同:
- Linux(GNU sed):
sed -i '/pattern/d' file直接修改,无备份 - macOS(BSD sed):
sed -i强制要求后缀,sed -i '' '/pattern/d' file才等价于 GNU 的无备份行为;漏掉''会报错或误建备份文件 - 更稳妥的做法:先不加
-i跑一遍看输出是否符合预期,确认后再加
-i,一到 macOS 就卡住;macOS 用户抄来 GNU 写法,又莫名多出一堆 .bak 文件。动手前花十秒查 sed --version 或 man sed 里关于 -i 的说明,省去半小时排查。











