如何从Unix中的文件(包括空格)中删除空行/空白行?


60

如何使用命令行在Unix / Linux中删除文件中的空行/空白行(仅包括空格)?

file.txt的内容

Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD

期望的输出

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD



1
这是一个史诗般的答案是用grep,sed的,AWK几乎给每个可能的解决方案:stackoverflow.com/questions/16414410/...
wisbucky

Answers:


86

sed行应该可以解决问题:

sed -i '/^$/d' file.txt

-i意味着它将就地编辑文件。


13
实际上,它必须为“ / ^ * $ / d”才能删除仅包含空格的行。
肖恩·赖夫施耐德

2
@SeanReifschneider编写此答案时,该要求不是问题吗?
kasperd '16

4
@SeanReifschneider“ / ^ \ s * $ / d”会不会更好,因为它会包含制表符?虽然原始帖子中未提及,但对我来说似乎是一个更强大的选择。
mrswadge


我得到bad flag in substitute command: 'e'
ishandutta2007

29

grep

一个简单的解决方案是通过使用下面的grepGNUBSD)命令。

  • 删除空白行(不包括带空格的行)。

    grep . file.txt
    
  • 完全删除空白行(包括带空格的行)。

    grep "\S" file.txt
    

注意:如果您得到不需要的颜色,则表示您grepgrep --color=auto(通过选中type grep)的别名。在这种情况下,您可以添加--color=none参数,也可以只运行命令为\grep(忽略别名)。


ripgrep

ripgrep(适用于更大的文件)类似。

删除不包括空格的行:

rg -N . file.txt

或包含带空格的行:

rg -N "\S" file.txt

也可以看看:


2
grep .似乎是最简单的解决方案。
Leo

grep .与其他解决方案相比,它的缺点是它将所有文本突出显示为红色。其他解决方案可以保留原始颜色。比较unbuffer apt search foo | grep .unbuffer apt search foo | grep -v ^$
wisbucky

1
@wisbucky您会看到颜色,因为在您的系统上它grep是别名grep --color=auto(请检查:)type grep。您可以将其运行为\grep或使用--color=none参数。
kenorb

@kenorb如果你使用grep --color=none .,你会得到所有的白色文本,它会覆盖原来的命令的颜色格式(例如:apt search foo
wisbucky

grep .将匹配仅包含空格的行,OP则不希望如此。
Jim L.


22

您可以将-v选项与grep一起使用以删除匹配的空行。

像这样

grep -Ev "^$" file.txt

4
我不相信您-E至少不需要使用GNU grep,但是除此之外,我很高兴看到使用grep完成此操作!这是我每次都优先于sed达成的目标;在我看来,在线过滤器似乎比在线编辑器更好。
MadHatter

如果您想跳过注释和空白行,尤其是在处理conf文件时,请使用grep -Ev '^#|^$' file.txt
Govind Kailas

7

这是一个awk解决方案:

awk NF file.txt

使用Awk时,NF只能在非空白行上设置。当此条件匹配时,Awk的默认操作是打印整行。


6

要删除空行,您可以使用以下命令挤压新行重复tr

cat file.txt | tr -s '\n' '\n'

这将产生6行,而不是OP请求的4行。
kenorb

1

xargs,如果您不介意删除前导空格

$ docker run -it --rm alpine sh
/ # cat <<eof > /tmp/file
> one
>
>   two
> three
>
>
>   four
> eof
/ # cat /tmp/file
one

  two
three


  four
/ # cat /tmp/file | xargs -n1
one
two
three
four

0

进出口价

这是使用ex编辑器(Vim的一部分)的方法:

ex -s +'v/\S/d' -cwq test.txt

对于多个文件(就地编辑):

ex -s +'bufdo!v/\S/d' -cxa *.txt

注意:该:bufdo命令不是POSIX

不修改文件(仅在标准输出上打印):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin

0

对我来说,@ martigin-heemels命令抛出了错误,因此将其修复(例如,i的虚拟参数),

sed -i '' '/^$/d' file.txt


0

删除空白行(不带空格)的最简单方法可能是使用cat -s

$ cat -s file
$ some-command | cat -s

至少如果您不想就地编辑文件,而是例如写入终端。此外,它不涉及任何有趣的正则表达式业务,因此即使对于非RE友好的人也非常容易记住。


来自man cat

-s, --squeeze-blank never more than one single blank line

在不同的操作系统上可能有所不同,但是上次我检查时在一些Linux和OpenBSD上却存在。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.