如何在bash中用一个空行替换多个空行?

时间:2009-05-28 18:24:17

标签: regex bash

我有一个包含以下内容的文件:

something



something else

something else again

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

something

something else

something else again

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

14 个答案:

答案 0 :(得分:74)

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

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

cat -s

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

答案 1 :(得分:15)

我刚刚通过sed解决了这个问题。即使这是一个7岁的问题,有人可以在这里寻求帮助,所以我在sed处写我的解决方案:

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

答案 2 :(得分:13)

grep -A1 . <yourfile> | grep -v "^--$"

这个grep解决方案可以正常运行,假设您需要以下内容:

<强>输入

line1

line2
line3


line4



line5

<强>输出

line1

line2
line3

line4

line5

答案 3 :(得分:11)

实际上,如果用一个换行符替换多个换行符,则输出结果为:

something
something else
something else again

您可以通过以下方式实现这一目标:

sed /^$/d FILE

答案 4 :(得分:3)

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

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

答案 5 :(得分:3)

通常,如果我发现sed无法做我需要的事情,我会转向awk:

awk '
BEGIN {
    blank = 0;
}

/^[[:blank:]]*$/ {
     if (!blank) {
          print;
     }
     blank = 1;
     next;
}

{
     print;
     blank = 0;
}' file

答案 6 :(得分:3)

这在多个文件上使用marco's solution

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

答案 7 :(得分:2)

如果有人想使用perl

perl -00pe0 < file

将执行相同的操作,如cat -s:)

答案 8 :(得分:1)

使用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)

答案 9 :(得分:1)

Python,带正则表达式:

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

答案 10 :(得分:0)

使用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

答案 11 :(得分:-1)

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

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

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

答案 12 :(得分:-2)

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

可以通过以下方式完成:

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

答案 13 :(得分:-4)

将其移植到| uniq 可能是解决方案(如果空行不重复)