最常用且安全的删除空行方式是sed '/^$/d',仅删纯空行(不含任何字符),预览推荐用sed '/^$/d' file.txt,修改原文件需注意GNU与macOS sed语法差异。

sed 删除空行最常用、也最安全的方式是:sed '/^$/d',但它只删真正“空”的行(不含任何字符),不处理含空格或制表符的“伪空行”。生产环境建议先预览再操作,避免误删。
只删纯空行(不含任何字符)
这是最基础的匹配:^ 表示行首,$ 表示行尾,中间无内容即为空行。
-
sed '/^$/d' file.txt:输出到终端,不改原文件(推荐先试) -
sed -i '/^$/d' file.txt:直接修改原文件(GNU sed 支持;macOS 的sed需写成sed -i '' '/^$/d' file.txt) - 注意:该命令对
line\n和\n都有效,但无法匹配\t\n(含空白字符的行)
删所有“视觉上为空”的行(含空格、制表符)
很多配置文件或日志导出后,行尾带空格或整行只有空白符,/^$/ 会漏掉它们。
- 用
[[:space:]]*匹配零个或多个空白字符:sed '/^[[:space:]]*$/d' file.txt -
[[:space:]]比\s更便携(POSIX 兼容,不依赖 GNU 扩展) - 如果只想删行首/行尾空白而不删整行,用
s/^[[:space:]]*//; s/[[:space:]]*$//替换而非删除
删末尾连续空行(保留中间空行)
有些场景(如模板生成、日志拼接)需要清理文件末尾冗余空行,但保留内容间的分隔空行。
- GNU sed 可用这个循环式写法:
sed ':a;/^\n*$/{$d;N;ba;}' file.txt - 更可靠且跨平台的做法是组合
tac+sed:tac file.txt | sed '/^[[:space:]]*$/d; /^[[:space:]]*$/q' | tac - 注意:单靠
sed做“末尾空行”判断逻辑较重,容易在大文件中性能下降
常见坑和兼容性提醒
不同系统 sed 行为差异不小,尤其在就地编辑和正则语法上。
- macOS / BSD
sed要求-i后必须跟扩展名(哪怕空字符串):sed -i '' '/^$/d' file.txt -
/^#/d这类注释删除命令,若文件含 DOS 换行符(\r\n),可能匹配失败——先用dos2unix或sed 's/\r$//' file.txt清理 -
sed默认按行读取,不支持跨行匹配;想删“从某关键字到空行之间所有内容”,得用/start/,/^$/d这种地址范围语法,而非单行正则
真正麻烦的不是写错命令,而是没意识到“空行”的定义有多种——纯空、含空白、末尾冗余、跨平台换行……选哪个模式,取决于你手里的文件到底“长什么样”。











