通过grep删除文本文件中的空行


Answers:


128

grep . FILE


(如果你真的想这样做在sed,则:sed -e /^$/d FILE

(如果你真的想这样做的AWK,然后:awk /./ FILE


1
甜!其他命令也使用TY-但看起来grep是我的新好朋友。
user191960

grep。FILE对我不起作用。最好使用grep来搜索文件内容,而使用sed来编辑文件内容。
Michael Dillon

7
sed -ne/./p也可以使用,而且效果awk /./更短({print}如果未指定,则采取操作)。@ ghostdog74:grep '[^[:space:]]'然后。
迅速

5
对于不懂的人,则.是一个正则表达式,可以匹配除换行符以外的任何字符。
wisbucky 2014年

3
grep . FILE适用于给定的示例,但不一定适用于文件可以具有不属于字符集的字节的情况。例如,对于GNU grep 2.20,printf "\x80\n" | grep .什么都不输出。
vinc17

37

请尝试以下操作:

grep -v -e '^$'

这与grep具有相同的效果。FILE中的空白行将被抓取。
ghostdog74

1
“ grep”查找与模式匹配的任何行。“。” 匹配任何字符。“ grep。FILE”匹配任何至少包含1个字符的行。而“ grep -v”排除与模式匹配的行。OP说“删除所有空白的新行”。如果要排除仅包含空格的行,请使用“ grep -v'^ $'”。“ ”将匹配零个或多个先前的模式,在这种情况下为空格。尽管您可能更喜欢匹配和排除其他空格字符(制表符,换页符等)。
Ree先生

3
这种方法使我比“ grep。FILE”更容易组合多个排除项。例如,我正在查看一个conf文件,并希望排除所有注释行和所有空行。因此,我使用了“ grep -v -e'#'-e'^ $'squid.conf”。工作了请客。
Ben K

2
这比grep快很多。文件'。这是由于验证正则表达式“”的任务更加复杂。比^ $不匹配时立即排除。
爱德华·洛佩兹

2
grep -v -e '^$'始终有效,而不是这种情况grep .。例如,对于GNU grep 2.20,printf "\x80\n" | grep .什么都不输出,而printf "\x80\n" | grep -v '^$'输出非空行。
vinc17

11
with awk, just check for number of fields. no need regex

$ more file
hello

world

foo

bar

$ awk 'NF' file
hello
world
foo
bar

不需要引号。这个技巧可以在awk1line.txt-然后再找到,所以大多数awk技巧也可以找到:)
短暂

2
这是我的好习惯,用引号引起来,因为您是从shell运行它的。对于复合awk语句,您仍然必须用引号引起来。那为什么不养成这种习惯呢。
ghostdog74


9

这是一个删除所有空白行或仅包含空格字符的行的解决方案:

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

2

试试这个: sed -i '/^[ \t]*$/d' file-name

它将删除所有没有编号的空白行。文件中的空白(空格或制表符),即(0或更多)。

注意:方括号内有一个“空格”,后跟“ \ t”。

修饰符-i将强制将更新的内容写回到文件中。没有此标志,您可以在屏幕上看到删除的空行,但实际文件不会受到影响。


1

grep '^..' my_file

THIS

IS

THE

FILE

EOF_MYFILE

它仅输出至少包含2个字符的行。

THIS
IS
THE
FILE
EOF_MYFILE

另请参见grep '^' my_file输出结果

THIS

IS

THE

FILE

EOF_MYFILE

以及grep '^.' my_file输出

THIS
IS
THE
FILE
EOF_MYFILE


0

尝试三通:

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

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

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

无需修改文件(只需在标准输出上打印):

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

0

Perl可能会过大,但效果也一样。

删除所有完全空白的行:

perl -ne 'print if /./' file

删除完全空白或仅包含空格的所有行:

perl -ne 'print if ! /^\s*$/' file

编辑原始文件并制作.bak文件的变体:

perl -i.bak -ne 'print if ! /^\s*$/' file

0

如果您想知道Xcode项目中的总代码行,而又不想列出每个swift文件的计数,那么这将为您提供答案。它删除完全没有代码的行,并删除以注释为前缀的行//

在您的Xcode项目的根级别运行它。

find . \( -iname \*.swift \) -exec grep -v '^[[:space:]]*$' \+ | grep -v -e '//' | wc -l

如果您的代码中有注释块,以下列开头/*和结尾*/

/*
 This is an comment block 
*/

那么这些将计入计数。(太难)。


0

最简单的答案-----------------------------------------

[root@node1 ~]# cat /etc/sudoers | grep -v -e ^# -e ^$
Defaults   !visiblepw
Defaults    always_set_home
Defaults    match_group_by_gid
Defaults    always_query_group_plugin
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
[root@node1 ~]#
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.