我有一堆文本文件,其中一些包含空行,即仅包含换行符,或可能包含空格,后跟换行符。我使用命令找到这些文件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
理解\s
为s
.因此,该模式^\s*$
将匹配由零个或多个s
字符组成的任何行。这包括空行,但不包括仅包含类似空格的字符的行。
删除空行或仅包含空格或制表符的行的便携式方法是
grep -v -x '[[:blank:]]*' file
这用于grep
仅提取不匹配的行[[:blank:]]*
。该[[:blank:]]*
模式匹配零个或多个空格或制表符。如果您想匹配更大的一组类似空格的字符(包括回车符和垂直制表符等),请改用[[:space:]]*
。该-x
选项grep
强制模式匹配完整的行(就像您使用 和 锚定了表达式一样^
)$
。
答案4
你可以使用:
grep '[[:graph:]]'
它将报告至少包含一个图形字符的行,因此排除空行或仅包含空白字符、控制字符、未知/未定义/无效字符的行。