加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

GNU sed中“D”命令的含义是什么?

发布时间:2020-12-13 23:52:44 所属栏目:Linux 来源:网络整理
导读:我已经阅读了D命令的 sed 手册.它说: D If pattern space contains no newline,start a normal new cycle as if the d command was issued. Otherwise,delete text in the pattern space up to the first newline,and restart cycle with the resultant pat
我已经阅读了D命令的 sed手册.它说:

D

If pattern space contains no newline,start a normal new cycle as if
the d command was issued. Otherwise,delete text in the pattern space
up to the first newline,and restart cycle with the resultant pattern
space,without reading a new line of input.

但我不知道,如何使用它

echo '''1
 2
 3
 4
 5'''>test1

 sed 'D' test1

什么都没有

解决方法

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

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

seq 5 | sed 'D'

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

seq 5 | sed 's/^/dummy linen/;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行.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读