sed d D比較

  函數參數 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. 

 

 

 

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章