函数参数 D 表示删除 pattern space 内的第一行资料。其指令格式如下: 

[address1,address2]D 


对上述格式有下面几点说明 : 

函数参数 D 最多配合两个地址参数。 
函数参数 D 与 d 的比较如下 : 
当 pattern space 内只有一数据行时 , D 与 d 作用相同。 
当 pattern space 内有多行资料行时 
D 表示只删除 pattern space 内第一行资料 ; d 则全删除。 
D 表示执行删除后 , pattern space 内不添加下一笔数据 , 而将剩下的数据重新执行 sed script ; d 则读入下一行后执行 sed script。


例如:

 
  
  1. This line is followed by 1 blank line. 
  2.  
  3. This line is followed by 2 blank lines. 
  4.  
  5.  
  6. This line is followed by 3 blank lines. 
  7.  
  8.  
  9.  
  10. This line is followed by 4 blank lines. 
  11.  
  12.  
  13.  
  14.  
  15. This is the end. 


我想得到的效果是

 
  
  1. This line is followed by 1 blank line. 
  2.  
  3. This line is followed by 2 blank lines. 
  4.  
  5. This line is followed by 3 blank lines. 
  6.  
  7. This line is followed by 4 blank lines. 
  8.  
  9. This is the end. 


代码如下

 
  
  1. /^$/{ 
  2. /^\n$/d 

执行后效果如下

 

 
  
  1. This line is followed by 1 blank line. 
  2.  
  3. This line is followed by 2 blank lines. 
  4. This line is followed by 3 blank lines. 
  5.  
  6. This line is followed by 4 blank lines. 
  7. This is the end. 

这个过程是这样的  sed是一行一行读入数据的,

首先读入第一行,因为并不匹配,所以直接打印出来,如下:

 

 
  
  1. This line is followed by 1 blank line. 

然后读入第二行,匹配,所以N继续读入第三行,然后再与/^\n$/进行匹配,很明显不匹配,所以内容也直接打印出来,如下:

 

 
  
  1. This line is followed by 1 blank line. 
  2.  
  3. This line is followed by 2 blank lines. 

接着读入第四行,匹配,所以N继续读入第5行,然后与/^\n$/进行匹配,因为此时读入的为2个空行,显然是匹配的这时候此2行被删除,所以此时打印的结果依旧如上。

接着再读入第5行,不匹配,直接打印出来,如下:

 

 
  
  1. This line is followed by 1 blank line. 
  2.  
  3. This line is followed by 2 blank lines. 
  4. This line is followed by 3 blank lines. 

接着读入第6行,匹配,N继续读入第7行,显然继续匹配,所以次2行被删除

接着读入8行,匹配,N继续读入第9行,不匹配,所以把第8 9行打印出来,如下

 

 
  
  1. This line is followed by 1 blank line. 
  2.  
  3. This line is followed by 2 blank lines. 
  4. This line is followed by 3 blank lines. 
  5.  
  6. This line is followed by 4 blank lines. 

接着读入第10行,匹配,N继续读入第11行,显然继续匹配,所以次2行被删除

接着读入第12行,匹配,N继续读入第13行,显然继续匹配,所以次2行被删除

最后读入最后14行,不匹配,直接打印,如下:

 

 
  
  1. This line is followed by 1 blank line. 
  2.  
  3. This line is followed by 2 blank lines. 
  4. This line is followed by 3 blank lines. 
  5.  
  6. This line is followed by 4 blank lines. 
  7. This is the end. 

而代码使用D

代码如下

 
  
  1. /^$/{ 
  2. /^\n$/D 

他的流程就不同了

 

首先读入第一行,因为并不匹配,所以直接打印出来,如下:

 
  
  1. This line is followed by 1 blank line. 


然后读入第二行,匹配,所以N继续读入第三行,然后再与/^\n$/进行匹配,很明显不匹配,所以内容也直接打印出来,如下:

 

 
  
  1. This line is followed by 1 blank line. 
  2.  
  3. This line is followed by 2 blank lines. 


接着读入第四行,匹配,所以N继续读入第5行,然后与/^\n$/进行匹配,因为此时读入的为2个空行,显然是匹配的,所以D把第4行删除,剩下第5行,但是此时第5行并不会打印出来,而是作为读入,继续运行这个脚本,也就是说第5行又先匹配/^$/,然后执行N,读入第6行,而此时内容已经不匹配/^\n$/,这样第5行和第6行就直接打印出来了,如下:

 

 
  
  1. This line is followed by 1 blank line. 
  2.  
  3. This line is followed by 2 blank lines. 
  4.  
  5. This line is followed by 3 blank lines. 

接着读入第7行,此时匹配,然后N继续读入第8行,依旧匹配,所以执行D,删除第7行,而第8行继续匹配,重新执行脚本,N继续读入第9行,此时依旧匹配,所以删除第8行,第9行继续匹配,N读入第10行,而此时不再匹配,所以打印出第9和10行,如下:

 

 
  
  1. This line is followed by 1 blank line. 
  2.  
  3. This line is followed by 2 blank lines. 
  4.  
  5. This line is followed by 3 blank lines. 
  6.  
  7. This line is followed by 4 blank line. 

然后读入11直到最后一行,最后得到所需要的结果

 

 

 
  
  1. This line is followed by 1 blank line. 
  2.  
  3. This line is followed by 2 blank lines. 
  4.  
  5. This line is followed by 3 blank lines.  
  6.  
  7. This line is followed by 4 blank line.  
  8.  
  9. This is the end.