如手册中所述,
D
删除模式空间的一部分,直到第一个嵌入的换行符。但我找不到任何文档解释 D
与地址范围的结合。例如:
$ cat /tmp/test
accident if I use one.
My wife won't let me buy a power saw. She is afraid of an
$ cat /tmp/test | sed -ne '$p;:a;N;$!{ba};2,$D'
accident if I use one.
My wife won't let me buy a power saw. She is afraid of an
看起来如果模式空间中有 2 行或更多行,则第一部分直到第一个嵌入换行符将被删除。
有官方文档吗?
为什么
2D
根本不起作用?
$ cat /tmp/test | sed -ne '$p;:a;N;$!{ba};2D'
以上 cmd 不会显示任何内容。
D
只是限制执行 D
的时间。地址范围就像一个“IF”子句:
2,$D
→ 如果这是第 2 行或以上,则 D
等价:
1!D
→ 如果不是,这是第 1 行 那么 D
2D
导致没有输出的原因是因为仅在N
循环加载第4行(最后一行)并且循环退出后才到达该语句(在您的示例中)。第 4 行 != 第 2 行,因此 D
不会被调用。我们可以插入=
来演示:
$ cat /tmp/test | sed -ne '$p;:a;N;$!{ba};=;2D'
4
$
$p
在读取第 1 行后首先被调用,因此此时它不会打印任何内容。 (如果这是最后一行,那么 p
。但是,第 1 行!= 最后一行。)
因为
2D
不会导致D
发生,所以不会再次达到$p
。此外,还提供了 -n
参数,因此没有默认打印。