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

Posted

技术标签:

【中文标题】通过 grep 删除文本文件中的空行【英文标题】:Remove empty lines in a text file via grep 【发布时间】:2010-12-09 08:50:34 【问题描述】:

FILE:

hello

world

foo

bar

如何删除此FILE 中的所有空新行?

命令输出:

FILE:

hello
world
foo
bar

【问题讨论】:

Delete empty lines using SED的可能重复 【参考方案1】:

grep . FILE


(如果你真的想在 sed 中做,那么:sed -e /^$/d FILE

(如果你真的想在 awk 中做,那么:awk /./ FILE

【讨论】:

甜蜜! TY 也用于其他命令 - 但看起来 grep 是我最好的新朋友。 grep 。文件对我不起作用。最好坚持使用 grep 搜索文件内容,使用 sed 编辑文件内容。 sed -ne/./p 也有效,awk /./ 更短(如果未指定,则操作为print)。 @ghostdog74: grep '[^[:space:]]' 然后。 对于那些不明白的人,. 是一个匹配除换行符之外的任何字符的正则表达式。 grep . FILE 适用于给定的示例,但不一定当文件可以包含不属于字符集的字节时。例如,使用 GNU grep 2.20,printf "\x80\n" | grep . 什么也不输出。【参考方案2】:

尝试以下方法:

grep -v -e '^$'

【讨论】:

这与 grep 具有相同的效果。文件中的空格作为空行将被抓取。 "grep" 查找与模式匹配的任何行。 “。”匹配任何字符。 "grep . FILE" 匹配任何至少有 1 个字符的行。而“grep -v”排除与模式匹配的行。 OP 说“删除所有空的新行”。如果你想排除只有空格的行,“grep -v '^ $'”。 "" 将匹配零个或多个前面的模式,在本例中是一个空格。尽管您也可能更喜欢匹配和排除其他空白字符(制表符、换页符等)。 这种方法让我可以更轻松地组合多个排除项,而不仅仅是“grep .FILE”。例如,我正在查看一个 conf 文件,并希望排除所有注释行和所有空行。所以我使用了“grep -v -e '#' -e '^$' squid.conf”。辛苦了。 这个比 'grep 快很多。文件'。这是由于验证正则表达式 '.' 的任务更加复杂。而不是在 ^$ 不匹配时立即排除。 grep -v -e '^$' 始终有效,grep . 则不然。例如,对于 GNU grep 2.20,printf "\x80\n" | grep . 不输出任何内容,而 printf "\x80\n" | grep -v '^$' 输出非空行。【参考方案3】:
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 技巧也是如此 :) 加引号只是我的好习惯,因为您是从 shell 运行它的。对于复合 awk 语句,您仍然必须加引号。那么为什么不培养这个习惯呢。 解释其工作原理:***.com/questions/23544804/…【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

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

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

【讨论】:

【参考方案6】:

试试ex-way:

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

【讨论】:

【参考方案7】:

Perl 可能有点矫枉过正,但它同样有效。

删除所有完全空白的行:

perl -ne 'print if /./' file

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

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

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

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

如果删除空行意味着包含任何空格的行,请使用:

grep '\S' FILE

例如:

$  printf "line1\n\nline2\n \nline3\n\t\nline4\n" > FILE
$  cat -v FILE
line1

line2

line3

line4
$  grep '\S' FILE
line1
line2
line3
line4
$  grep . FILE
line1
line2

line3

line4

另见:

How to remove empty/blank lines (including spaces) in a file in Unix? How to remove blank lines from a file in shell? 与sed: Delete empty lines using sed 与awk:Remove blank lines using awk

【讨论】:

【参考方案10】:

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

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

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

如果您的代码中有以/* 开头并以*/ 结尾的注释块,例如:

/*
 This is an comment block 
*/

然后这些将包含在计数中。 (太难了)。

【讨论】:

【参考方案11】:

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

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

【讨论】:

以上是关于通过 grep 删除文本文件中的空行的主要内容,如果未能解决你的问题,请参考以下文章

Linux基础命令学习

如何通过powershell将每一行文本文件保存为数组

delphi写多行文本文件操作

C语言如何判断文本文档的结束

有没有办法通过存储在 Google Cloud Storage 中的文本文档进行 grep?

打开 VS Code 并打开一个空白文本文件