如何从文件中删除多个空行?

Baa*_*rud 15 scripting sed awk perl filter

我有一些用于做笔记的文本文件 - 只是纯文本,通常只使用cat >> file. 有时我会使用一两个空行(只需返回 - 换行符)来指定一个新的主题/思路。在每个会话结束时,在使用Ctrl+关闭文件之前D,我通常会添加大量 (5-10) 空行(返回键)以分隔会话。

这显然不是很聪明,但它为此目的对我有用。我不过最终了很多很多不必要的空行,所以我在寻找一种方式来删除(大部分)的额外线。是否有一个 Linux 命令(剪切、粘贴、grep、...?)可以直接与几个选项一起使用?或者,是否有人对 sed、awk 或 perl(实际上是任何脚本语言,尽管我更喜欢 sed 或 awk)脚本有什么想法可以做我想做的事?用 C++ 写一些东西(我实际上可以自己做),看起来有点矫枉过正。

案例#1:我需要的是一个脚本/命令,它可以删除两个以上(3 个或更多)连续的空行,并将它们替换为两个空行。虽然如果它也可以调整以删除多于一行(2 或更多)和/或仅用一个空行替换多个空行,那就太好了。

案例#2:我也可以使用一个脚本/命令来删除两行文本之间的单个空行,但保留多个空行(尽管删除其中一个空行也是可以接受的)。

Ant*_*hon 15

您可以使用uniq将多个空行实例折叠为一个空行,但它也会折叠包含文本的行,如果它们相同且彼此低于。


Sté*_*las 15

情况1:

awk '!NF {if (++n <= 2) print; next}; {n=0;print}'
Run Code Online (Sandbox Code Playgroud)

案例2:

awk '!NF {s = s $0 "\n"; n++; next}
     {if (n>1) printf "%s", s; n=0; s=""; print}
     END {if (n>1) printf "%s", s}'
Run Code Online (Sandbox Code Playgroud)


Bas*_*lvi 6

情况1:

perl -i -ane '$n=(@F==0) ? $n+1 : 0; print if $n<=2'
Run Code Online (Sandbox Code Playgroud)

案例2:

perl -i -ane '$n=(@F==0) ? $n+1 : 0; print $n==2 ? "\n$_" : $n==1 ? "" : $_ '
Run Code Online (Sandbox Code Playgroud)


Tho*_*hor 5

您可以使用 GNU sed 解决案例#1:

sed -r ':a; /^\s*$/ {N;ba}; s/( *\n *){2,}/\n\n/'
Run Code Online (Sandbox Code Playgroud)

也就是说,收集模式空间中的空行,如果有超过三行或更多行,则将其减少到两行。

要连接单行行,如案例#2 所示,您可以这样做:

sed -r '/^ *\S/!b; N; /\n *$/!b; N; /\S *$/!b; s/\n *\n/\n/'
Run Code Online (Sandbox Code Playgroud)

或者以注释的形式:

sed -r '
  /^ *\S/!b        # non-empty line
  N                # 
  /\n *$/!b        # followed by empty line
  N                # 
  /\S *$/!b        # non-empty line
  s/\n *\n/\n/     # remove the empty line
'
Run Code Online (Sandbox Code Playgroud)