如何删除Linux文件中空行(含空格/制表符)及其上一行?
解决方案:删除含空白字符的空行及其上一行
问题分析
你需要删除文件中仅包含空格/制表符的空行,以及该空白行的上一行。之前尝试的grep -B 1 -v无法生效,是因为grep的反向匹配无法处理这种关联多行的删除逻辑;而原sed命令失效是因为匹配规则只针对完全空的行(^$),没有覆盖带空白字符的情况。
方法一:修正后的sed命令
利用tac倒序文件,将目标行对(上一行+空白行)转换为空白行在前、原上一行在后的顺序,再用sed删除匹配的空白行及其下一行,最后倒序恢复原顺序:
tac filename | sed '/^[[:space:]]*$/,+1 d' | tac
原理说明
tac filename:将文件内容倒序输出,把原文件中“上一行→空白行”的结构变成“空白行→上一行”sed '/^[[:space:]]*$/,+1 d':匹配任意空白字符组成的行(^[[:space:]]*$),并删除该行以及紧随其后的一行(即原文件的上一行)tac:再次倒序,恢复文件的原始顺序
方法二:awk命令处理
通过记录上一行内容,逐行判断并控制输出:
awk ' prev == "" { prev = $0; next } /^[[:space:]]*$/ { prev = ""; next } { print prev; prev = $0 } END { print prev } ' filename
原理说明
- 初始化
prev变量保存上一行内容,若prev为空(处理第一行时),直接将当前行赋值给prev并跳过后续逻辑 - 若当前行是仅含空白字符的行,清空
prev(相当于放弃输出上一行)并跳过 - 若当前行是有效内容,输出
prev(即上一行有效内容),并将当前行更新为新的prev END块输出最后一行有效内容(避免遗漏)
验证示例
针对你的输入文件:
967 77836 783 273
6
使用上述任意命令后,输出结果符合预期:
77836 783 273
6
内容的提问来源于stack exchange,提问作者user19619903
相关产品推荐
相关产品推荐

