438

我正在尝试使用 sed 删除空行:

sed '/^$/d'

但我没有运气。

例如,我有这些行:

xxxxxx


yyyyyy


zzzzzz

我希望它像:

xxxxxx
yyyyyy
zzzzzz

这应该是什么代码?

4

17 回答 17

744

您的“空”行中可能有空格或制表符。使用POSIX 类withsed删除所有仅包含空格的行:

sed '/^[[:space:]]*$/d'

使用 ERE 的较短版本,例如使用 gnu sed:

sed -r '/^\s*$/d'

(注意 sed 不支持PCRE。)

于 2013-05-07T08:24:24.303 回答
150

我错过了awk解决方案:

awk 'NF' file

哪个会返回:

xxxxxx
yyyyyy
zzzzzz

这是如何运作的?由于NF代表“字段数”,那些为空的行有 0 个字段,因此 awk 将 0 评估为 False 并且不打印任何行;但是,如果至少有一个字段,则评估为 True 并awk执行其默认操作:打印当前行。

于 2015-04-09T21:35:31.690 回答
77

sed '/^$/d'应该没问题,您是否希望修改文件到位?如果是这样,您应该使用该-i标志。

也许这些行不是空的,所以如果是这样的话,看看这个问题Remove empty lines from txtfiles, remove spaces from start and end of line我相信这就是你想要实现的。

于 2013-05-07T08:23:58.207 回答
33

我相信这是最简单和最快的一个:

cat file.txt | grep .

如果您还需要忽略所有空白行,请尝试以下操作:

cat file.txt | grep '\S'

例子:

s="\
\
a\
 b\
\
Below is TAB:\
    \
Below is space:\
 \
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l

输出

7
5
于 2014-10-17T03:26:56.923 回答
16

在此处 接受的答案和上面接受的答案的帮助下,我使用了:

$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt

`s/^ *//`  => left trim
`s/ *$//`  => right trim
`/^$/d`    => remove empty line
`/^\s*$/d` => delete lines which may contain white space

这涵盖了所有基础,非常适合我的需求。感谢原始海报@Kent 和@kev

于 2014-07-25T14:10:24.383 回答
15

sed不带, awk,perl等的另一种选择

strings $file > $output

字符串 - 打印文件中可打印的字符串。

于 2020-05-01T20:45:44.163 回答
5

你可以说:

sed -n '/ / p' filename    #there is a space between '//'
于 2014-05-27T10:06:14.947 回答
4

您很可能会看到意外行为,因为您的文本文件是在 Windows 上创建的,因此行尾是\r\n. 您可以在运行 sed 或使用之前使用 dos2unix 将其转换为 UNIX 样式的文本文件

sed -r "/^\r?$/d"

删除空行,无论是否有回车符。

于 2017-03-04T05:12:01.113 回答
3

您尝试的命令是正确的,只需使用 -E 标志即可。

sed -E '/^$/d'

-E 标志使 sed 捕获扩展的正则表达式。更多信息在这里

于 2021-05-08T16:45:10.053 回答
2

你也可以使用“grep”来做类似的事情:

egrep -v "^$" file.txt
于 2014-08-11T17:20:41.040 回答
2

这也适用于 awk。

awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
于 2016-08-25T11:03:45.863 回答
1

我的bash特定答案是建议为此使用perl带有全局模式标志的替换运算符g,如下所示:

$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz

这个答案说明了考虑空行中是否有空格([\ ]*),以及|用于分隔多个搜索词/字段。在 macOS High Sierra 和 CentOS 6/7 上测试。

仅供参考,OP 的原始代码在高性能超级计算集群的 macOS High Sierra 和 CentOS 6/7 Linux 上的终端中运行sed '/^$/d' $file良好。bash

于 2018-07-24T21:34:42.570 回答
0

如果你想使用现代的 Rust 工具,你可以考虑:

  • ripgrep
    • cat datafile | rg '.'带空格的行被认为是非空的
    • cat datafile | rg '\S'带空格的行被认为是空的
    • rg '\S' datafile带空格的行被认为是空的-N可以添加以删除屏幕显示的行号)
  • sd
    • cat datafile | sd '^\n' ''带空格的行被认为是非空的
    • cat datafile | sd '^\s*\n' ''带空格的行被认为是空的
    • sd '^\s*\n' '' datafile就地编辑
于 2021-12-19T17:27:13.470 回答
-1

使用 vim 编辑器删除空行

:%s/^$\n//g

于 2021-04-09T03:36:21.373 回答
-1

NF 是 awk 的命令,可用于删除文件中的空行 awk NF filename 并使用 sed sed -r "/^\r?$/d"

于 2021-12-12T13:11:28.470 回答
-2

对我来说,使用sed的 FreeBSD 10.1仅适用于这个解决方案:

sed -e '/^[     ]*$/d' "testfile"

里面[]有空格和制表符。

测试文件包含:

fffffff next 1 tabline ffffffffffff

ffffffff next 1 Space line ffffffffffff

ffffffff empty 1 lines ffffffffffff

============ EOF =============
于 2017-03-17T14:19:24.630 回答