为了验证D命令后的语句是否会执行,写了如下实例,(其中=表示输出当前行号,=;=表示输出当前行号两次):
[work@ test_sed]$ seq -f"%05g" 1 6 | sed -n ':a;N;p;=;D;N;p;=;=;ba'
00001
00002
2
00002
00003
3
00003
00004
4
00004
00005
5
00005
00006
6
可以发现行号并没有连续输出两次,所以语句执行到D后,后面的“N;p;=;=;ba”并没有执行,去掉上面命令中第一个N,执行如下:
[work@ test_sed]$ seq -f"%05g" 1 6 | sed -n ':a;p;=;D;N;p;=;=;ba'
00001
1
00002
2
00003
3
00004
4
00005
5
00006
6
可以发现,语句执行到D后,后面的“N;p;=;=;ba”并没有执行,去掉前面命令中的D,执行如下:
[work@ test_sed]$ seq -f"%05g" 1 6 | sed -n ':a;N;p;=;N;p;=;=;ba'
00001
00002
2
00001
00002
00003
3
3
00001
00002
00003
00004
4
00001
00002
00003
00004
00005
5
5
00001
00002
00003
00004
00005
00006
6
去掉D命令后,可以发现后面的“N;p;=;=;ba”执行了。所以,D命令将结束本轮sed语句,开始下一个循环。D命令后的语句将不再执行。另,d(Delete pattern space. Start next cycle.)命令也是一样:
[work@ test_sed]$ seq -f"%05g" 1 6 | sed -n ':a;N;p;=;d;N;p;=;=;ba'
00001
00002
2
00003
00004
4
00005
00006
6