【问题标题】:Remove blank lines with grep用 grep 删除空行
【发布时间】:2011-03-26 20:13:58
【问题描述】:

我在 Linux 中尝试了grep -v '^$',但没有奏效。此文件来自 Windows 文件系统。

【问题讨论】:

    标签: text terminal grep newline


    【解决方案1】:

    尝试以下方法:

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

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

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

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

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

    【讨论】:

    • 那个 egrep 只适用于行上有 0 个或 1 个空格的文件,而不适用于有 2 个或更多空格的文件。改变 ?到 *.
    • 这应该是grep -E -v-e 之后的所有内容都被解释为模式。
    • grep -v -e '^[[:space:]]*$' -e '^#' file 将为您提供脚本或配置文件(或任何使用 cmets 哈希字符的文件类型)中的所有非空白、非注释行。
    • "-e 选项允许匹配正则表达式模式。"这是非常误导-e 是(POSIX-)定义:This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).(来自the manual)。默认情况下,Grep 已经需要一个(基本)正则表达式。对于这种模式,您可以完全省略 -egrep -v '^[[:space:]]*$' foo.txt
    • 如果您正在处理的文件可能具有 Windows 样式的 CR+LF 换行符,但又不想排除带有其他空格的行,请使用此正则表达式:'^[[:cnrl:]]?$'。跨度>
    【解决方案2】:

    保持简单。

    grep . filename.txt
    

    【讨论】:

    • 这给了我文件中的所有行
    • @LưuVĩnhPhúc 它应该输出文件中除空白行之外的所有行。
    • 这对我来说适用于来自基于 linux 的系统的文件,但不适用于来自 Windows 的文件。大概是因为 Windows 行尾字符。
    • 我对此表示赞同,尽管它并不能完全解决 OP 处理带有 Windows 行结尾的文件的问题,但由于我没有这个问题,结果证明这是完美的我的解决方案。
    • 这是完美的解决方案。简单且在 Linux 上运行。
    【解决方案3】:

    用途:

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

    或者只是简单的 awk:

    awk 'NF' file
    

    如果你没有dos2unix,那么你可以使用tr之类的工具:

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

    【讨论】:

    • 找不到程序dos2unix。这适用于 Windows 吗? ask 命令也不起作用。
    • 问?不,那是awk
    • 关于转换为 UNIX 风格的行尾的好点,否则正则表达式可能无法按预期工作。在我转换行尾之前,这里没有任何东西对我有用。
    【解决方案4】:
    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

    【讨论】:

    • 这是如何以及为什么起作用的?如果你能解释一下,你的答案会好得多。例如,您的正则表达式匹配字符串的开头,然后使用 POSIX 标准匹配一个或多个空格,然后匹配字符串的结尾,即使用 grep -v 它删除所有只有空格的行。正确的?如果没有空格会发生什么;它只是一个换行符?
    • 如我的示例所示,即使只删除了一个空行(第一行)。我添加了更多信息,希望对您有所帮助。 :)
    【解决方案5】:

    和前面的答案一样:

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

    这里,grep -e 表示grep 的扩展版本。 '^$' 表示 ^(Start of line) 和 $(end of line) 之间没有任何字符。 '^' 和 '$' 是正则表达式字符。

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

    这样,空行就被消除了。

    【讨论】:

    • -e 不是“grep 的扩展版”的意思,可能你和-E 混淆了?该手册清楚地表明-e 只是明确表示遵循一种模式。由于该模式不是以破折号开头,而且您只是定义了一个模式,因此您最好将其省略,因为默认情况下 grep 需要一个正则表达式模式:grep -v '^$' foo.txt(不需要扩展正则表达式功能)。另外值得一提的是,这不会消除文件中的空白行,只会消除通过输出管道传输的空白行。对于这种情况,sed -i 将是正确的工具。
    【解决方案6】:

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

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

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

    您的输出将来自

    match1
    
    
    
    match2
    

    match1
    
    match2
    

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

    【讨论】:

      【解决方案7】:

      我更喜欢使用egrep,尽管在我使用带有空行的真实文件的测试中,您的方法运行良好(尽管在我的测试中没有引号)。这也有效:

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

      【讨论】:

      • 试过了。空行仍然显示。这可能是因为该文件是在 Windows 中制作的吗?
      【解决方案8】:

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

      如果是的话

      grep "\S" file.txt

      否则

      grep . file.txt

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

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

          【解决方案10】:
          awk 'NF' file-with-blank-lines > file-with-no-blank-lines
          

          【讨论】:

            【解决方案11】:

            我很努力,但这似乎有效(假设\r 在这里咬你):

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

            【讨论】:

            • 如果我将第一部分替换为文件的输出,则可以。
            【解决方案12】:

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

            awk 'NF' foo.txt
            

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

            grep -v '^ *$' foo.txt
            

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

            或者你可以使用 \s 来表示这样的空格:

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

            【讨论】:

              【解决方案13】:

              使用 Perl:

              perl -ne 'print if /\S/'
              

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

              【讨论】:

                【解决方案14】:

                egrep -v "^\s\s+"

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

                + 复制当前模式。

                ^ 表示开头

                【讨论】:

                  【解决方案15】:

                  用途:

                  grep pattern filename.txt | uniq
                  

                  【讨论】:

                  • uniq 会将相邻的空行减少到只有一个空行,但不会完全删除它们。尽管如此,我还是喜欢尝试像这样使用uniq。首先排序将有效地删除所有空行 - 只留下一个,但重新排列行顺序可能是不可接受的。
                  • 好点。这也会扼杀重复的线条。我想我的解决方案引入了错误。
                  【解决方案16】:

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

                  [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
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2016-07-06
                    • 2017-08-11
                    • 2010-12-09
                    • 2015-02-13
                    • 2018-12-25
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多