2010-08-08 86 views

回答

199

尝试以下操作:

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

-e选项允许正则表达式模式的匹配。

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

更新:这适用于空白行或“所有空白区域”的文件(例如带有\ r \ n样式行结尾的窗口行),而上述仅删除空白行和unix文件样式行结尾:

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

它仍然显示空行。 – 2010-08-08 00:24:33

+0

查看问题的更新。 – ars 2010-08-08 00:52:39

+0

是的,这是有效的。它也适用于grep。 – 2010-08-08 01:15:20

1

我喜欢用egrep,尽管我用空行真正的文件测试你的方法工作的罚款(虽然没有在我的测试带引号)。这工作太:

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

试过了。空行仍在显示。这可能是因为该文件是在Windows中创建的? – 2010-08-08 00:25:36

1

拼命,但这似乎工作(假设\r这里咬你)

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

如果我用文件中的输出替换第一部分,那么这起作用。 – 2010-08-08 01:38:50

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

或者只是在awk

awk 'NF' file 

如果你不没有dos2unix,那么你可以使用像tr

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

找不到程序dos2unix。这是Windows吗? ask命令也不起作用。 – 2010-08-08 01:36:43

+0

问?不,这是'awk'。 – iconoclast 2014-10-03 18:19:28

+0

转换为UNIX样式行结束符的好处否则正则表达式可能无法按预期工作。直到我转换行结束为止,这里没有任何工作。 – 2016-08-31 14:41:51

12
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删除所有只有空格的行。对?如果没有空格会发生什么;它只是一个换行符? – Ben 2012-12-07 21:20:20

+0

正如我的例子所示,即使只有一条空行被删除(第一行)。我添加了更多信息,所以希望这会有所帮助。 :) – Sepero 2012-12-08 01:02:06

0

grep pattern filename.txt | uniq的

+0

'uniq'会将相邻的空白行减少到一个空行,但不会完全删除它们。不过,我喜欢尝试像那样使用'uniq'。首先排序会有效地删除所有空白行 - 只留下一行,但重新排列行顺序可能不可接受。 – 2013-01-16 02:43:08

+0

好点。这也将重复线条。我想我的解决方案引入了错误。 – baitisj 2013-01-17 05:57:08

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

使用Perl:

perl -ne 'print if /\S/' 

\S意味着匹配非空白字符。

0

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

[[email protected] ~]# 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 
1

同上答案

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

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

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

这种方式空的空行被消除

23

保持简单。

grep . filename.txt 
+0

这给了我文件中的所有行 – 2017-01-24 06:11:51

+1

@LưuVĩnhPhúc它应该输出文件中除空行外的所有行。 – 2017-02-19 23:33:24

+0

这适用于我基于Linux系统的文件,但不适用于Windows的文件。大概是因为Windows行尾字符。 – ocertat 2018-02-09 15:07:21

1

如果你有一排多个空行的序列,并希望每个序列只有一个空行,尽量

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

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

你的输出会去从

match1 



match2 

match1 

match2 

在原始输出三个空行会被压缩或“挤压”到一个空行。

0

的egrep -v “^ \ S \ S +”

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

+重复当前模式。

的^是开始

4

您可以删除这个例子空行:

grep . filename.txt