如何使用命令行在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


评论

对于awk,请参阅:删除awk中的空行,或使用grep,通常请参阅:如何从shell中的文件中删除空行?

这里给出了相同的问题和相同的答案,但票数更多

这是一个史诗般的答案,几乎可以使用grep,sed,awk给出所有可能的解决方案:stackoverflow.com/questions/16414410/…

#1 楼

这条sed行应该可以解决问题:

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


-i表示它将编辑文件就地。

评论


实际上,它必须为“ / ^ * $ / d”才能删除仅包含空格的行。

– Sean Reifschneider
2011-3-28 23:36

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

–卡巴斯德
16年4月18日在10:02

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

– mrswadge
17-09-20在12:57



添加\ s *是stackoverflow问题给出的相同解决方案

–特雷弗·博伊德·史密斯
18年2月21日在19:17

我在替代命令中得到了错误的标志:'e'

–ishandutta2007
19年4月13日在2:12

#2 楼

grep

简单的解决方案是使用grep(GNU或BSD)命令,如下所示。



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

grep . file.txt



完全删除空白行(包括带有空格的行)。

grep "\S" file.txt



注意:如果您得到不需要的颜色,则表示您的grepgrep --color=auto的别名(请通过type grep进行检查)。在这种情况下,您可以添加--color=none参数,或仅将命令作为\grep(忽略别名)运行。用于更大的文件)。

删除不包括空格的行:

rg -N . file.txt


或包括空格的行:

rg -N "\S" file.txt



另请参阅:


如何从文件(包括制表符和空格)中删除空白行? >使用ripgrep:使用sed删除空行

使用ripgrep:使用awk删除空白行



评论


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

–狮子座
18年3月21日在21:36

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

– Wisbucky
19-4-25在23:09



@wisbucky您会看到颜色,因为grep在您的系统上别名为grep --color = auto(检查方式:键入grep)。您可以将其作为\ grep运行或使用--color = none参数。

– Kenorb
19-4-25在23:26



@kenorb如果使用grep --color = none。,您将获得所有白色文本,这些文本将覆盖原始命令的颜色格式(例如:apt search foo)

– Wisbucky
19年4月26日在2:01

grep。将匹配仅包含空格的行,OP则不希望这样。

– Jim L.
19年7月19日在21:53

#3 楼

sed '/^$/d' file.txt


^$是仅与空白行匹配的正则表达式,行开头为行,后为行结尾。

评论


+1说明

– Alex Raj Kaliamoorthy
18年2月17日在10:26

此命令不会产生与请求的OP相同的输出(它将产生5行,而不是4行)。

– Kenorb
19年7月22日在9:31

#4 楼

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

像这样

grep -Ev "^$" file.txt


评论


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

– MadHatter
2011年3月28日在22:45



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

– Govind Kailas
19 Mar 7 '19 at 4:11

如果使用@GovindKailas命令,则grep(GNU grep)3.4要求-E

–另一个用户
20年8月15日在4:07

#5 楼

这是一个awk解决方案:

awk NF file.txt


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

#6 楼

要删除空行,可以使用tr挤压新行重复:

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


评论


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

– Kenorb
19年7月22日在9:34

#7 楼

Ex / Vim

这是使用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


#8 楼

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
 


#9 楼

对我来说,@ martigin-heemels命令抛出错误,此错误已解决(例如,i的虚拟参数),

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