sed `D` 与地址范围

问题描述 投票:0回答:1

如手册中所述,

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 不会显示任何内容。

sed
1个回答
0
投票
具有地址线范围的

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
参数,因此没有默认打印。

© www.soinside.com 2019 - 2024. All rights reserved.