使用 grep 删除空行

问题描述 投票:0回答:18

我在 Linux 中尝试了

grep -v '^$'
,但没有成功。该文件来自 Windows 文件系统。

text terminal grep newline
18个回答
397
投票

尝试以下操作:

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

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

^$
周围的单引号使其适用于 Cshell。其他 shell 会很乐意使用单引号或双引号。

更新:这对我来说适用于带有空白行或“全空白”的文件(例如带有

\r\n
样式行结尾的 Windows 行),而上面的内容仅删除带有空白行和 unix 样式行结尾的文件:

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

119
投票

保持简单。

grep . filename.txt

39
投票

用途:

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

或者只是简单的 awk:

awk 'NF' file

如果你没有dos2unix,那么你可以使用像tr这样的工具:

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

19
投票
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


6
投票

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

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

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

你的输出将来自

match1



match2

match1

match2

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


4
投票

与之前的答案相同:

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

这里,

grep -e
表示grep的扩展版本。 '^$' 表示 ^(行开始)和 $(行结束)之间没有任何字符。 '^' 和 '$' 是正则表达式字符。

因此命令

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

这样,空的空白行就被消除了。


4
投票

文件中的行是否有空格字符?

如果是的话

grep "\S" file.txt

否则

grep . file.txt

答案来自: https://serverfault.com/a/688789


3
投票

我更喜欢使用

egrep
,尽管在我使用带有空行的真实文件的测试中,你的方法工作得很好(尽管在我的测试中没有引号)。这也有效:

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

3
投票

此代码删除空白行和以“#”开头的行

 grep -v "^#" file.txt | grep -v ^[[:space:]]*$

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

2
投票

使用 grep -v -e '^$' 确实可以工作,但是它不会删除其中有 1 个或多个空格的空白行。我发现删除空白行最简单的答案是使用 awk。以下是上面 awk 人员的一点修改:

awk 'NF' foo.txt

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

grep -v '^ *$' foo.txt

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

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

grep -v '^\s*$' foo.txt

1
投票

我努力尝试,但这似乎有效(假设

\r
在这里咬你):

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

0
投票

使用 Perl:

perl -ne 'print if /\S/'

\S
表示匹配非空白字符。


0
投票

egrep -v "^\s\s+"

egrep 已经做了正则表达式,并且 \s 是空格。

+ 复制当前模式。

^代表开始


0
投票

用途:

grep pattern filename.txt | uniq

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 '^$' folderlist.txt

文件夹列表.txt

folder1/test

folder2
folder3

folder4/backup
folder5/backup

结果将是:

folder1/test
folder2
folder3
folder4/backup
folder5/backup

0
投票

您可以:

(1) 仅显示非空行:

grep .

grep '\S'

grep '[[:graph:]]'

(2) 隐藏空行:

grep -v '^$'

grep -v '^[[:space:]]*$'
  • .
    = 除换行符之外的任何字符
  • '\S'
    = 模式,其中
    \S
    代表不是空白字符(请阅读更多内容pcre2syntax - Perl 兼容的正则表达式)
  • '[[:graph:]]'
    =模式,其中
    [[:xxxxx:]]
    代表正POSIX命名集,
    graph
    代表pcre2syntax的字符类“打印,不包括空格”
  • -v
    = 反转匹配的意义,以选择不匹配的行(阅读更多关于 grep Matching Control 选项)
  • '^$'
    =模式,其中
    ^
    代表行的开头
    $
    代表行的结尾(等于空行)
  • '^[[:space:]]*$'
    = 模式,其中
    ^
    代表行的开头,
    [[:xxxxx:]]
    代表 POSIX 命名集,
    space
    代表字符类“空白”,
    *
    代表零次或多次出现,
    $
    代表行尾线

在某些版本的 grep 上,您可能还必须使用此选项:

  • -E
    = extended-regexp - 将模式解释为扩展正则表达式
© www.soinside.com 2019 - 2024. All rights reserved.