如何从文本文件中删除视觉上的空行?

如何从文本文件中删除视觉上的空行?

我有一堆文本文件,其中一些包含空行,即仅包含换行符,或可能包含空格,后跟换行符。我使用命令找到这些文件find

  • 示例文件
    #Title 1
    12345678 1234
    
    #Title 2
    12345678 1234
    12345678 1234
    
    
    
    
    
    
    
    
  • 预期产出
    #Title 1
    12345678 1234
    #Title 2
    12345678 1234
    12345678 1234
    

我想删除所有此类空行。我在 Debian Linux Stretch 上使用以下命令进行了尝试:

cat "/path/to/file" | sed '/^\s*$/d' | sponge "/path/to/file";

例如,某些文件有 4 个或更多尾随空白行,但上述命令仅删除了除其中一个尾随空白行之外的所有内容。

我怎样才能删除最后一个空白行?如上所述:如果文件中还有空白行,那么也应该删除这些空白行。

我试图在文件之间获得一定的一致性,因为文件存储在 BASH 变量中的排序数组中。然后循环文件并删除所有空行和尾随空白行,而某些文件已经没有空行或任何尾随空白行。

答案1

如果我正确理解你的问题,你想从文本文件中删除(真正或视觉上)空行。这可以使用 轻松完成awk

对于单个文件,您可以调用

awk 'NF' /path/to/file

这只会打印行上至少有一个“非空白”字符的文件。这背后的想法是,awk默认情况下将输入行拆分为“空白”处的“字段”,即连续的空格和制表符。但是,如果一行仅包含此类字符,则内部存储在自动变量中的字段数NF将被识别为“零”。上面的(相当短的)程序强加了必须非零的条件NF才能打印当前行。这有效地删除了真正的或“视觉上”的空行。

由于awk默认情况下不会执行内联编辑,因此您可能必须将输出重定向到临时文件然后重命名,或者使用能够理解扩展名的足够新的实现-i inplace

awk -i inplace 'NF' /path/to/file

答案2

这是另一种可移植的方法,即仅包含包含空格以外的内容的行:

grep '[^[:space:]]' file

您也可以对其他命令使用相同的方法:

sed -n '/[^[:space:]]/p' file

写入与源相同的文件是一个相当标准的过程。某些命令使用-i(或等效命令)来指示到位编辑,但实际上他们实际上写入临时文件,然后用临时文件覆盖原始文件:

some_command file >file.tmp && mv -f file.tmp file
rm -f file.tmp

file如果没有来自其他地方的硬链接,那么效果很好。为了满足这种情况,您需要一个双份副本:

some_command file >file.tmp && cat file.tmp >file
rm -f file.tmp

答案3

不幸的是,我只能在 macOS 上重现您的问题,其中sed理解\ss.因此,该模式^\s*$将匹配由零个或多个s字符组成的任何行。这包括空行,但不包括仅包含类似空格的字符的行。


删除空行或仅包含空格或制表符的行的便携式方法是

grep -v -x '[[:blank:]]*' file

这用于grep仅提取不匹配的行[[:blank:]]*。该[[:blank:]]*模式匹配零个或多个空格或制表符。如果您想匹配更大的一组类似空格的字符(包括回车符和垂直制表符等),请改用[[:space:]]*。该-x选项grep强制模式匹配完整的行(就像您使用 和 锚定了表达式一样^$

答案4

你可以使用:

grep '[[:graph:]]'

它将报告至少包含一个图形字符的行,因此排除空行或仅包含空白字符、控制字符、未知/未定义/无效字符的行。

相关内容