如何使用sed只删除双空行?

时间:2012-09-26 09:44:53

标签: regex linux sed

我找到了关于如何删除三条空行的question and answer。但是,我只需要双空行。 IE浏览器。应完全删除所有双空行,但应保留单个空白行。

我知道一点sed,但建议删除三条空白行的命令在我脑海中:

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

7 个答案:

答案 0 :(得分:49)

使用cat

会更容易
cat -s

答案 1 :(得分:11)

我评论了你不理解的sed命令:

sed '
    ## In first line: append second line with a newline character between them.
    1N;
    ## Do the same with third line.
    N;
    ## When found three consecutive blank lines, delete them. 
    ## Here there are two newlines but you have to count one more deleted with last "D" command.
    /^\n\n$/d;
    ## The combo "P+D+N" simulates a FIFO, "P+D" prints and deletes from one side while "N" appends
    ## a line from the other side.
    P;
    D
'

删除1N,因为我们只需要'堆叠'中的两行,然后使用第二行N,并将/^\n\n$/d;更改为/^\n$/d;以删除所有两行空行。

测试:

infile的内容:

1


2
3

4



5

6


7

运行sed命令:

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

产量:

1
2
3

4

5

6
7

答案 2 :(得分:7)

使用awk

会更容易
awk -v RS='\n\n\n' 1

答案 3 :(得分:5)

sed '/^$/{N;/^\n$/d;}'

它只删除文件中的两个连续空行。您只能在文件中使用此表达式,然后才能完全理解。如果出现空白行,它将进入大括号。

通常sed会读一行。 N会将第二行附加到模式空间。如果该行是空行。这两行都是换行符。

/^\n$/此模式将匹配d只能运行的时间。否则d无法正常工作。 d用于删除模式空间的整个内容,然后开始下一个循环。

答案 4 :(得分:1)

但是上述解决方案仅删除3个连续空白行的首次搜索。 要删除全部,请使用下面的命令

连续3行
sed '1N;N;/^\n\n$/ { N;s/^\n\n//;N;D; };P;D' filename

答案 5 :(得分:-1)

但是上述解决方案仅删除3个连续空白行的首次搜索。要删除全部,请使用下面的命令

连续3行

sed'1N; N; / ^ \ n \ n $ / {N; s / ^ \ n \ n //; N; D; }; P; D'文件名

答案 6 :(得分:-2)

只需将其传递给'uniq'命令,所有空行都将缩减到只有一行。更简单更好。

澄清:正如Marlar所说,如果你有“其他非空白的连续重复行”,你不想摆脱它,这不是一个解决方案。这个在其他情况下的解决方案,比如在尝试清理配置文件时,这是我在看到这个问题时所遇到的解决方案。我只是使用'uniq'解决了我的问题。