函數參數 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。
例如:
- This line is followed by 1 blank line.
- This line is followed by 2 blank lines.
- This line is followed by 3 blank lines.
- This line is followed by 4 blank lines.
- This is the end.
我想得到的效果是
- This line is followed by 1 blank line.
- This line is followed by 2 blank lines.
- This line is followed by 3 blank lines.
- This line is followed by 4 blank lines.
- This is the end.
代碼如下
- /^$/{
- N
- /^\n$/d
- }
執行後效果如下
- This line is followed by 1 blank line.
- This line is followed by 2 blank lines.
- This line is followed by 3 blank lines.
- This line is followed by 4 blank lines.
- This is the end.
這個過程是這樣的 sed是一行一行讀入數據的,
首先讀入第一行,因爲並不匹配,所以直接打印出來,如下:
- This line is followed by 1 blank line.
然後讀入第二行,匹配,所以N繼續讀入第三行,然後再與/^\n$/進行匹配,很明顯不匹配,所以內容也直接打印出來,如下:
- This line is followed by 1 blank line.
- This line is followed by 2 blank lines.
接着讀入第四行,匹配,所以N繼續讀入第5行,然後與/^\n$/進行匹配,因爲此時讀入的爲2個空行,顯然是匹配的這時候此2行被刪除,所以此時打印的結果依舊如上。
接着再讀入第5行,不匹配,直接打印出來,如下:
- This line is followed by 1 blank line.
- This line is followed by 2 blank lines.
- This line is followed by 3 blank lines.
接着讀入第6行,匹配,N繼續讀入第7行,顯然繼續匹配,所以次2行被刪除
接着讀入8行,匹配,N繼續讀入第9行,不匹配,所以把第8 9行打印出來,如下
- This line is followed by 1 blank line.
- This line is followed by 2 blank lines.
- This line is followed by 3 blank lines.
- This line is followed by 4 blank lines.
接着讀入第10行,匹配,N繼續讀入第11行,顯然繼續匹配,所以次2行被刪除
接着讀入第12行,匹配,N繼續讀入第13行,顯然繼續匹配,所以次2行被刪除
最後讀入最後14行,不匹配,直接打印,如下:
- This line is followed by 1 blank line.
- This line is followed by 2 blank lines.
- This line is followed by 3 blank lines.
- This line is followed by 4 blank lines.
- This is the end.
而代碼使用D
代碼如下
- /^$/{
- N
- /^\n$/D
- }
他的流程就不同了
首先讀入第一行,因爲並不匹配,所以直接打印出來,如下:
- This line is followed by 1 blank line.
然後讀入第二行,匹配,所以N繼續讀入第三行,然後再與/^\n$/進行匹配,很明顯不匹配,所以內容也直接打印出來,如下:
- This line is followed by 1 blank line.
- This line is followed by 2 blank lines.
接着讀入第四行,匹配,所以N繼續讀入第5行,然後與/^\n$/進行匹配,因爲此時讀入的爲2個空行,顯然是匹配的,所以D把第4行刪除,剩下第5行,但是此時第5行並不會打印出來,而是作爲讀入,繼續運行這個腳本,也就是說第5行又先匹配/^$/,然後執行N,讀入第6行,而此時內容已經不匹配/^\n$/,這樣第5行和第6行就直接打印出來了,如下:
- This line is followed by 1 blank line.
- This line is followed by 2 blank lines.
- This line is followed by 3 blank lines.
接着讀入第7行,此時匹配,然後N繼續讀入第8行,依舊匹配,所以執行D,刪除第7行,而第8行繼續匹配,重新執行腳本,N繼續讀入第9行,此時依舊匹配,所以刪除第8行,第9行繼續匹配,N讀入第10行,而此時不再匹配,所以打印出第9和10行,如下:
- This line is followed by 1 blank line.
- This line is followed by 2 blank lines.
- This line is followed by 3 blank lines.
- This line is followed by 4 blank line.
然後讀入11直到最後一行,最後得到所需要的結果
- This line is followed by 1 blank line.
- This line is followed by 2 blank lines.
- This line is followed by 3 blank lines.
- This line is followed by 4 blank line.
- This is the end.