函数参数 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.
转载于:https://blog.51cto.com/lsscto/880770