使用sed删除空行

时间:2013-05-07 08:20:19

标签: linux unix sed

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

sed '/^$/d'

但我没有运气。

例如,我有以下几行:

xxxxxx


yyyyyy


zzzzzz

我希望它像:

xxxxxx
yyyyyy
zzzzzz

这应该是什么代码?

15 个答案:

答案 0 :(得分:552)

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

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

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

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

(请注意,sed NOT 支持PCRE。)

答案 1 :(得分:69)

我错过了awk解决方案:

awk 'NF' file

哪会回来:

xxxxxx
yyyyyy
zzzzzz

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

答案 2 :(得分:52)

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

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

答案 3 :(得分:31)

答案 4 :(得分:28)

我相信这是最容易和最快的一个:

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

答案 5 :(得分:13)

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

$ 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的原创海报

答案 6 :(得分:7)

另一个没有sedawkperl等的选项

strings $file > $output

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

答案 7 :(得分:5)

你可以说:

sed -n '/ / p' filename    #there is a space between '//'

答案 8 :(得分:2)

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

egrep -v "^$" file.txt

答案 9 :(得分:2)

这也适用于awk。

awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz

答案 10 :(得分:2)

您很可能会看到意外行为,因为您的文本文件是在Windows上创建的,因此行序列的结尾为\r\n。在运行sed或使用

之前,可以使用dos2unix将其转换为UNIX样式的文本文件
sed -r "/^\r?$/d"

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

答案 11 :(得分:0)

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

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

此答案说明了如何解释空行中是否有空格([\ ]*),以及使用|来分隔多个搜索词/字段。在macOS High Sierra和CentOS 6/7上进行了测试。

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

答案 12 :(得分:-1)

使用vim编辑器删除空行

:%s/^$\n//g

答案 13 :(得分:-1)

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

sed -E '/^$/d'

-E 标志使 sed 捕获扩展的正则表达式。 More info here

答案 14 :(得分:-3)

对于使用 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 =============