“D”命令在sed中做了什么?

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

我已经阅读了sed命令的D手册。它说:

d

如果模式空间不包含换行符,则启动正常的新循环,就像发出d命令一样。否则,删除模式空间中直到第一个换行符的文本,然后使用生成的模式空间重新启动循环,而不读取新的输入行。

但我不知道如何使用它。

$ seq 5 | sed D

输出什么都没有。

sed
1个回答
8
投票

让我们考虑四个例子。虽然只有最后两个可能被认为是有用的,但它们都说明了D的工作原理。

默认情况下,sed读取其输入并一次将一行放入模式中。除非采取步骤向模式空间添加换行符,否则模式空间永远不会有换行符。在这种情况下,D就像d,因此,此命令不产生输出:

seq 5 | sed 'D'

我们可以使用替换命令将换行符放入模式空间。在下文中,我们向模式空间添加换行符,然后删除D命令。因为有换行符,sed开始循环而不读取任何输入。因此,以下是无限循环:

seq 5 | sed 's/^/dummy line\n/;p; D'  # Infinite loop

现在,让我们用D做一些有用的事情。在下面的示例中,我们使用N读取一个新行,导致两行在模式空间中,换行符分隔它们。除了在输入的最后一行,我们要求D命令删除旧行,sed开始循环。因此,以下sed命令的行为类似于tail -2

$ seq 5 | sed 'N;$!D'   # Like `tail -2`
4
5

最后,让我们将其扩展为仅打印文件的最后X行。以X = 5为例,下面打印输入的最后5行:

$ seq 200 | sed ':a; N; 1,5ba; D'  # Like `tail -5`
196
197
198
199
200

循环:a; N; 1,5ba将文件的前5行读入模式空间。之后,N读取一个新行,而D导致模式空间中最旧的行被删除。因此,模式空间将始终具有最新的5行。

(另请注意,feature命令的GNU特定N依赖于那里,即在退出文件的最后一行之前打印模式空间。)

以上命令都是在GNU sed下测试的。对于BSD sed,期望进行一些小的改动以获得相同的结果。

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