用grep删除空白行


Answers:


300

请尝试以下操作:

grep -v -e '^$' foo.txt

-e选项允许使用正则表达式模式进行匹配。

单引号^$使它适用于Cshell。其他shell将对单引号或双引号感到满意。

更新:这对我来说适用于具有空行或“所有空白”的文件(例如带有“ \ r \ n”样式行结尾的Windows行),而上述内容仅删除具有空行和Unix样式行结尾的文件:

grep -v -e '^[[:space:]]*$' foo.txt

该egrep仅适用于行中空间为零或1的文件,不适用于空间为2或更多的文件。改变?至 *。
Ed Morton

4
这应该是grep -E -v,之后的所有内容都将-e被解释为模式。
jazzpi

6
grep -v -e '^[[:space:]]*$' -e '^#' file会在脚本或配置文件(或任何使用井号字符进行注释的文件类型)中为您提供所有非空白,非注释行。
palswim

“该-e选项允许使用正则表达式模式进行匹配。” 那是非常误导的-e是(POSIX-)定义:(This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).来自手册)。默认情况下,Grep已经期望一个(基本)正则表达式。对于这种模式,您可能会-e完全忽略:grep -v '^[[:space:]]*$' foo.txt
雪人

73

把事情简单化。

grep . filename.txt

1
这给了我文件中的所有行
phuclv

2
@LưuVĩnhPhúc应该输出文件中除空行以外的所有行。
Frej Connolly

2
这对我适用于基于Linux的系统中的文件,但不适用于Windows中的文件。大概是因为Windows的行尾字符。

尽管它不能完全解决OP处理带有Windows行尾的文件的问题,但我对此表示反对,但是由于我没有这个问题,所以这对我来说是完美的解决方案。
David Z

1
这是完美的解决方案。简单并且在Linux上工作。
W00f

30

用:

$ dos2unix file
$ grep -v "^$" file

或者只是简单地awk:

awk 'NF' file

如果您没有dos2unix,则可以使用类似tr的工具:

tr -d '\r' < "$file" > t ; mv t "$file"

找不到程序dos2unix。是Windows版吗?ask命令也不起作用。
节点忍者

问?不,那是awk
iconoclast 2014年

有关转换为UNIX样式的行尾的要点,否则正则表达式可能无法按预期工作。在转换行尾之前,这里没有任何帮助。
Ryan H.

16
grep -v "^[[:space:]]*$"

The -v makes it print lines that do not completely match

===Each part explained===
^             match start of line
[[:space:]]   match whitespace- spaces, tabs, carriage returns, etc.
*             previous match (whitespace) may exist from 0 to infinite times
$             match end of line

运行代码

$ echo "
> hello
>       
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok

要了解有关其工作方式/原因的更多信息,建议阅读正则表达式。http://www.regular-expressions.info/tutorial.html


2
这如何以及为什么起作用?如果可以解释,您的答案会更好。例如,您的正则表达式匹配字符串的开头,然后使用POSIX标准匹配一个或多个空格,然后匹配字符串的结尾,即使用grep -v删除仅是空格的所有行。对?如果没有空格会怎样?只是换行符?
2012年

如我的示例所示,即使仅删除空行(第一行)。我添加了更多信息,希望对您有所帮助。:)
Sepero 2012年

3

我更喜欢使用egrep,尽管在测试带有空白行的正版文件时,您的方法效果很好(尽管在测试中不带引号)。这也起作用:

egrep -v "^(\r?\n)?$" filename.txt

试过了。空白行仍在显示。难道是因为文件是在Windows中制作的?
节点忍者

3

如果您连续有多个空白行的序列,并且每个序列只想要一个空白行,请尝试

grep -v "unwantedThing" foo.txt | cat -s

cat -s 抑制重复的空输出线。

您的输出将来自

match1



match2

match1

match2

原始输出中的三个空白行将被压缩或“压缩”为一个空白行。


2
awk 'NF' file-with-blank-lines > file-with-no-blank-lines

2

与之前的答案相同:

grep -v -e '^$' foo.txt

在这里,grep -e是指grep的扩展版本。'^ $'表示^(行首)和$(行尾)之间没有任何字符。'^'和'$'是正则表达式字符。

因此,该命令grep -v将打印所有与此模式不匹配的行(^和$之间没有字符)。

这样,可以消除空白行。


-e并不意味着“ grep的扩展版本”,也许您感到困惑-E?该手册明确指出,-e仅明确指出遵循一种模式。由于该模式并非以破折号开头,并且无论如何您仅定义了一种模式,因此最好将其省略,因为默认情况下,grep希望使用一种正则表达式模式:(grep -v '^$' foo.txt不需要扩展的正则表达式功能)。还值得一提的是,这并不能消除文件中的空白行,而只能消除通过输出管道传输的空白行。对于这种情况,sed -i将是正确的工具。
雪人

1

我尽力了,但这似乎奏效了(假设\r在这里咬你):

printf "\r" | egrep -xv "[[:space:]]*"

如果我用文件的输出替换了第一部分,那行得通。
节点忍者


0

egrep -v“ ^ \ s \ s +”

egrep已经做过正则表达式,而\ s是空格。

+复制当前模式。

^是开始


0

用:

grep pattern filename.txt | uniq

uniq会将相邻的空白行减少为一个空白行,但不会完全删除它们。尽管如此,我还是喜欢这样使用uniq。首先排序将有效地删除所有空行-仅保留一个空行,但是重新排列行顺序可能不可接受。
扎克·杨

好点子。这也会使重复的行断断续续。我猜我的解决方案会引入错误。
baitisj

0

这是去除白线和以#符号开头的线的另一种方法。我认为这对于读取配置文件非常有用。

[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults    requiretty
Defaults   !visiblepw
Defaults    always_set_home
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
stack ALL=(ALL) NOPASSWD: ALL

0

确实可以使用grep -v -e'^ $',但是它不会删除其中包含1个或多个空格的空行。我发现删除空行最简单的答案是使用awk。以下是对上述awk家伙的一些修改:

awk 'NF' foo.txt

但是由于这个问题是关于使用grep的,所以我将回答以下问题:

grep -v '^ *$' foo.txt

注意:^和*之间的空格。

或者,您可以使用\ s来表示空白,如下所示:

grep -v '^\s*$' foo.txt
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.