关于linux:使用sed删除空行

Delete empty lines using sed

我尝试使用sed删除空行:

1
sed '/^$/d'

但我没有运气。

例如,我有以下几行:

1
2
3
4
5
6
7
xxxxxx


yyyyyy


zzzzzz

我希望它是这样的:

1
2
3
xxxxxx
yyyyyy
zzzzzz

这个代码应该是什么?


您的"空"行中可能有空格或制表符。使用带有sed的posix类删除只包含空白的所有行:

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

一个较短的版本,使用了ERE,例如GNU SED:

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

(请注意,SED不支持PCRE。)


我错过了awk解决方案:

1
awk 'NF' file

会返回:

1
2
3
xxxxxx
yyyyyy
zzzzzz

这是怎么工作的?由于NF代表"字段数",空的行有0个字段,所以awk的值为0到false,不打印任何行;但是,如果至少有一个字段,则该值为true,并使awk执行其默认操作:打印当前行。


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

也许这些行不是空的,所以如果是这样的话,看看这个问题,从txtfiles中删除空行,从行首和行尾删除空格,我相信这就是你想要实现的。


塞德

  • 埃多克斯1〔6〕
  • 江户十一〔七〕号
  • 埃多克斯1〔8〕
  • 埃多克斯1〔9〕

格雷普

  • 埃多克斯1〔10〕
  • 江户十一〔11〕。
  • 埃多克斯1〔12〕
  • 埃多克斯1〔13〕

AWK

  • 埃多克斯1〔14〕
  • 埃多克斯1〔15〕
  • 江户十一〔16〕号
  • 埃多克斯1〔17〕
  • 埃多克斯1〔18〕


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

1
cat file.txt | grep .

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

1
cat file.txt | grep '\S'

例子:

1
2
3
4
5
6
7
8
9
10
11
12
s="\
\
a\
 b\
\
Below is TAB:\
    \
Below is space:\
 \
c\
\
"; echo"$s" | grep . | wc -l; echo"$s" | grep '\S' | wc -l

输出

1
2
7
5


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

1
2
3
4
5
6
$ 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


你可以说:

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


您很可能会看到意外的行为,因为您的文本文件是在Windows上创建的,所以行尾序列是

。在运行sed或使用之前,可以使用dos2unix将其转换为unix样式的文本文件。

1
2
sed -r"/^
?$/d"

删除空白行,无论回车是否存在。


这也适用于awk。

1
2
3
4
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz


你也可以用"grep"来做类似的事情:

1
egrep -v"^$" file.txt

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

1
2
3
4
5
6
$ perl -pe s'/^
|^[\ ]*
//g' $file
xxxxxx
yyyyyy
zzzzzz

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

仅供参考,操作系统的原始代码sed '/^$/d' $file在MacOS High Sierra上的bash终端和高性能超级计算集群中的Centos6/7 Linux上工作得很好。


对于我和Freebsd 10.1和Sed一起工作的人来说,只有这个解决方案:

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

[]中有空格和制表符。

测试文件包含:

1
2
3
4
5
6
7
fffffff next 1 tabline ffffffffffff

ffffffff next 1 Space line ffffffffffff

ffffffff empty 1 lines ffffffffffff

============ EOF =============