【问题标题】:How can I replace multiple empty lines with a single empty line in bash?如何在bash中用一个空行替换多个空行?
【发布时间】:2009-05-28 18:24:16
【问题描述】:

我有一个文件包含:

something



something else

something else again

我需要一个 bash 命令,sed/grep w.e,它将产生以下输出

something

something else

something else again

换句话说,我需要用一个空行替换多个空行。 grep/sed 是基于行的。我从未找到适用于多行正则表达式模式的 BASH 解决方案。

【问题讨论】:

  • 快速澄清问题:文件中是否有不是由空行分隔的行?
  • 你有没有重复的非空白行?如果没有,你可以使用 uniq。
  • 有些行没有用空行分隔。可能有重复的行。

标签: regex bash


【解决方案1】:

对于 BSD 衍生系统(包括 GNU):

您只需要 cat-s 选项,这会导致它从其输出中删除重复的空行:

cat -s

来自手册页:-s --squeeze-blank: suppress repeated empty output lines.

【讨论】:

  • 无论出于何种原因对我不起作用cat -s file1 > file2
  • @qdeninja 当我处理带有 Windows 行结尾的文件时,它对我也不起作用。也许这也可能是你的问题?当我将文件转换为 Unix 行结尾时,cat -s 对我来说效果很好。
  • 在我在 Solaris 上的 cat 版本中,-s 选项具有不同的含义“-s cat 对不存在的文件保持沉默”
  • @VictorZamanian 大多数时候,不可能像 qdeninja 那样重定向回文件。欲了解更多信息,请在此处阅读:stackoverflow.com/questions/6696842/…
  • 请注意,它可以通过管道使用:some_output|cat -s.
【解决方案2】:

我刚刚通过sed 解决了这个问题。即使这是一个 7 年前的问题,有人可能会觉得这很有帮助,所以我在这里通过sed 编写我的解决方案:

sed 'N;/^\n$/D;P;D;'

【讨论】:

  • 这对我很有效,因为它是 sed,我可以使用 -i 进行就地修复。
  • 奇怪的是,这也为我删除了文件的最后两行(在 OSX sed 上)
  • sed '$!N;/^\n$/{$q;D;};P;D;' 防止在 OSX sed 上删除最后一行。也适用于 gnu sed。
  • 谢谢,让您知道这仍然是有用的信息。
【解决方案3】:
grep -A1 . <yourfile> | grep -v "^--$"

假设您需要以下内容,此 grep 解决方案有效:

输入

line1

line2
line3


line4



line5

输出

line1

line2
line3

line4

line5

【讨论】:

  • 我喜欢,非常优雅的解决方案
  • 真的太棒了。一百万年后我不会想到这个。不错的作品。 稍微更健壮的版本当然是这样的(处理非空的空白行): grep -v -A1 '^[[:blank:]]*$' | grep -v '^--$'
【解决方案4】:

实际上,如果您用一个换行符替换多个换行符,输出将是:

something
something else
something else again

您可以通过以下方式实现:

sed /^$/d FILE

【讨论】:

  • 这显然是正确的 :) OP 可能的意思是用一个空行(除非它位于序列的开头或结尾)表示两个换行符。
【解决方案5】:

awk 的解决方案,用一个空行替换几个空行:

awk 'BEGIN{bl=0}/^$/{bl++;if(bl==1)print;else next}/^..*$/{bl=0;print}' myfile

【讨论】:

    【解决方案6】:

    通常,如果我发现 sed 不能做我需要的事情,我会求助于 awk:

    awk '
    BEGIN {
        blank = 0;
    }
    
    /^[[:blank:]]*$/ {
         if (!blank) {
              print;
         }
         blank = 1;
         next;
    }
    
    {
         print;
         blank = 0;
    }' file
    

    【讨论】:

      【解决方案7】:

      如果有人想使用 perl

      perl -00pe0 < file
      

      会做同样的事情,就像cat -s :)

      【讨论】:

        【解决方案8】:

        使用 awk:

        awk '{ /^\s*$/?b++:b=0; if (b<=1) print }' file
        

        细分:

        /^\s*$/?b++:b=0
            - ? :       the ternary operator
            - /^\s*$/   matches a blank line
            - b         variable that counts consecutive blank lines (b++).
                        however, if the current line is non-blank, b is reset to 0.
        
        
        if (b<=1) print
            print if the current line is non-blank (b==0)
                  or if there is only one blank line (b==1).
        

        通过调整正则表达式,您可以将其推广到其他场景,例如在电子邮件中挤压多个空行 (">"): https://stackoverflow.com/a/59189823/12483961

        【讨论】:

        • 我真的很喜欢这个,因为它是第一个适用于 DOS 文件的解决方案(带有 \r\n 换行符),而且您可以将 b
        【解决方案9】:

        这对多个文件使用marco's solution

        for i in *; do FILE=$(cat -s "$i"); echo "$FILE" > "$i"; done
        

        【讨论】:

          【解决方案10】:

          使用python:

          s = file("filename.txt").read()
          while "\n\n\n" in s: s = s.replace("\n\n\n", "\n\n")
          import sys
          sys.stdout.write(s)
          

          【讨论】:

          • 这是效率低下的while循环
          【解决方案11】:

          Python,带正则表达式:

          import re
          import sys
          sys.stdout.write(re.sub('\n{2,}','\n\n', sys.stdin.read()))
          

          【讨论】:

            【解决方案12】:

            使用 vim 超级容易。只需打开文件并输入以下内容:

            :%s/\n\n\n*/\r\r/
            

            这会将超过 2 个新行的所有块减少为 2 个新行。希望这会有所帮助!

            【讨论】:

              【解决方案13】:

              我认为您可能想要删除只有空格的行。

              这可以通过:

              sed /^[:space:]*$/d FILE
              

              【讨论】:

                【解决方案14】:

                将其流水线化到 |uniq 可能是解决方案(如果不是空行不重复)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-06-04
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-03-20
                  • 2010-11-19
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多