一尘不染

sed中的“保留空间”和“模式空间”的概念

linux

我对sed中的两个概念感到困惑:保持空间和模式空间。有人可以帮忙解释一下吗?

这是手册的摘要:

h H    Copy/append pattern space to hold space.
g G    Copy/append hold space to pattern space.

n N    Read/append the next line of input into the pattern space.

这六个命令确实使我感到困惑。


阅读 541

收藏
2020-06-03

共1个答案

一尘不染

当sed逐行读取文件时,当前已读取的行将插入到 模式
缓冲区(模式空间)中。模式缓冲区类似于临时缓冲区,即存储当前信息的暂存器。当您告诉sed打印时,它将打印图案缓冲区。

保持缓冲区/保持空间就像是一个长期存储,因此您可以捕获某些东西,将其存储起来,然后在sed处理另一行时再使用它。您不直接处理保留空间,相反,如果您想对其进行处理,则需要将其复制或追加到模式空间。例如,print命令p仅打印图案空间。同样,s在模式空间上操作。

这是一个例子:

sed -n '1!G;h;$p'

(-n选项禁止自动打印行)

这里有三个命令:1!Gh$p1!G有一个地址,1(第一行),但!该命令将被执行到处手段 ,但
在第一行上。$p另一方面,只会在最后一行执行。那么会发生什么:

  1. 读取第一行并将其自动插入模式空间
  2. 在第一行,不执行第一条命令;h将第一行复制到 保留 空间。
  3. 现在第二行替换了模式空间中的所有内容
  4. 在第二行,首先我们执行G,将保持缓冲区的内容追加到模式缓冲区,并用换行符将其分隔。模式空间现在包含第二行,换行符和第一行。
  5. 然后,h命令将模式缓冲区的并置内容插入到保留空间中,该空间现在保留两行和一行的反向行。
  6. 我们继续进行第三行-转到上面的点(3)。

最后,在读取最后一行并将保持空间(以相反的顺序包含所有先前的行)添加到图案空间之后,用来打印图案空间p。您已经猜到了,上面的tac命令完全可以执行该命令-
反向打印文件。

2020-06-03