如何仅删除单个空行 - 保留多个空行

时间:2016-06-21 20:34:38

标签: linux bash awk sed

我有一些数据,我想保留多个空行并仅删除单个空白行。我的数据如下所示:

1

2

3

4


5


6

7

8



9

10

我希望输出为:

1
2
3  
4


5


6
7
8



9
10

我尝试过使用以下命令,但我似乎无法使用它:

awk ' /^$/ { print; } /./ { printf("%s ", $0); }'

并且

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

另外,我尝试使用cat -s,但这并不一定要删除空白行。此外,我玩sed '/^$/'但不能指定单行。任何帮助是极大的赞赏。

3 个答案:

答案 0 :(得分:6)

使用gnu-awk非常简单:

awk -v RS='\n+' '{printf "%s", $0 (length(RT) != 2 ? RT : "\n")}' file

1
2
3
4


5


6
7
8



9
10
  • 使用-v RS='\n+'我们将1个或多个换行符作为记录分隔符
  • 使用length(RT)我们检查每条记录后的换行符数
  • 如果RT
  • ,我们会打印length != 2(原始捕获值)

备用awk命令

awk -v RS='\n{3,}' '{gsub(/\n{2}/, "\n", $0); printf "%s", $0 RT}' file

答案 1 :(得分:2)

使用GNU sed(BSD / OSX需要的小修改):

$ sed -E ':a; N; $!ba; :b; s/([^\n])\n\n([^\n])/\1\n\2/g; tb' input
1
2
3
4


5


6
7
8



9
10

如何运作

  • :a; N; $!ba

    立即阅读整个文件。

    此处,a是一个标签。 N读入下一行。 $!ba分支回标签,除非我们在最后一行。

  • :b; s/([^\n])\n\n([^\n])/\1\n\2/g; tb

    用单个换行符替换双换行符。根据需要重复。

    此处b是一个标签。 s命令删除双换行符。如果删除了任何双重换行符,则tb会转回标签b

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed '/\S/!b;n;N;/^\s*\n\s*\S/D' file

如果一行是空的,请将其打印出来。否则,打印该行并获取接下来的两行,如果其中第一行为空但第二行不为,则删除第一行并重复。