sed '/^[[:space:]]*$/d' 能删除所有空白行,因 ^ 和 $ 锁定整行,[[:space:]]* 匹配任意数量空白字符(含空格、制表符等),覆盖真正空行及仅含空白的“假空行”。

用 sed '/^[[:space:]]*$/d' 就能一键清掉所有空白行,包括真正空的、只含空格、制表符、甚至混合空白字符的“假空行”。
为什么这个正则能覆盖所有无意义行
关键在 ^[[:space:]]*$ 这个模式:
- ^ 锁定行首,$ 锁定行尾,确保整行都被匹配
-
[[:space:]]* 匹配零个或多个空白字符(空格、制表符、换行符、回车符等),比单纯写
或\t更全面 - 哪怕一行只有两个空格、一个制表符加几个空格,甚至 Windows 下的
\r\n前导空白,它都能识别并删除
安全使用:先预览,再修改
别急着改原文件,先确认效果:
- 只查看清理后结果:
sed '/^[[:space:]]*$/d' file.txt - 保存到新文件:
sed '/^[[:space:]]*$/d' file.txt > clean.txt - 确认无误再原地修改:
• Linux:sed -i '/^[[:space:]]*$/d' file.txt
• macOS:sed -i.bak '/^[[:space:]]*$/d' file.txt(会生成 .bak 备份)
进阶:顺手清理行首尾空格
如果还想让每行更干净,可以链式处理:
- 先删空行,再裁空格:
sed '/^[[:space:]]*$/d; s/^[[:space:]]\+//; s/[[:space:]]\+$//' - 或一步到位(GNU sed 支持多命令):
sed -e '/^[[:space:]]*$/d' -e 's/^[[:space:]]\+//' -e 's/[[:space:]]\+$//' - 注意:
[[:space:]]\+表示“一个或多个空白字符”,比*更精准,避免误删空行本身
其他常见场景补充
如果文件里还有注释行(如以 # 开头),想一并清理:
- 删空行 + 注释行:
sed '/^[[:space:]]*#/d; /^[[:space:]]*$/d' file.txt - 合并写法(更简洁):
sed '/^\s*\(#\|$\)/d' file.txt(需加-r启用扩展正则) - 实际中建议分步操作,避免正则过于复杂导致漏删或多删

















