Stream 编辑器 - 工作流程

在本章中,我们将探讨 SED 究竟是如何工作的。 要成为专家级 SED 用户,需要了解其内部结构。 SED 遵循一个简单的工作流程:读取、执行和显示。 下图描述了工作流程。

Stream 编辑器工作流程
  • Read: SED 从输入流(文件、管道或标准输入)中读取一行并将其存储在其称为模式缓冲区的内部缓冲区中。

  • Execute: 所有 SED 命令都按顺序应用于模式缓冲区。 默认情况下,除非指定了行寻址,否则 SED 命令将应用于所有行(全局)。

  • Display: 将(修改后的)内容发送到输出流。 发送数据后,模式缓冲区将为空。

  • 重复上述过程,直到文件用完。


注意事项

  • 模式缓冲区是 SED 使用的私有、内存中、易失性存储区域。

  • 默认情况下,所有 SED 命令都应用于模式缓冲区,因此输入文件保持不变。 GNU SED 提供了一种就地修改输入文件的方法。 我们将在后面的部分中探讨它。

  • 还有另一个称为 hold buffer 的内存区域,它也是私有的、内存中的易失性存储区域。 数据可以存储在保持缓冲区中以供以后检索。 在每个周期结束时,SED 删除模式缓冲区的内容,但保持缓冲区的内容在 SED 周期之间保持不变。 但是 SED 命令不能直接在保持缓冲区上执行,因此 SED 允许在保持缓冲区和模式缓冲区之间移动数据。

  • 最初模式和保持缓冲区都是空的。

  • 如果没有提供输入文件,则 SED 接受来自标准输入流 (stdin) 的输入。

  • 如果默认情况下未提供地址范围,则 SED 对每一行进行操作。

示例

让我们创建一个文本文件 quote.txt 来包含著名作家 Paulo Coelho 的名言。

[jerry]$ vi quote.txt 
There is only one thing that makes a dream impossible to achieve: the fear of failure. 
 - Paulo Coelho, The Alchemist

要了解 SED 的工作流程,让我们使用 SED 显示文件 quote.txt 的内容。 此示例模拟 cat 命令。

[jerry]$ sed '' quote.txt

当上面的代码执行时,会产生如下结果。

There is only one thing that makes a dream impossible to achieve: the fear of failure. 

在上面的示例中,quote.txt 是输入文件名,在此之前有一对单引号表示 SED 命令。 让我们揭开这个操作的神秘面纱。

首先 SED 从输入文件 quote.txt 中读取一行并将其存储在其模式缓冲区中。 然后它在模式缓冲区上应用 SED 命令。 在我们的例子中,没有 SED 命令,因此没有对模式缓冲区执行任何操作。 最后,它删除并在标准输出上打印模式缓冲区的内容。 不是很简单吗?

在以下示例中,SED 接受来自标准输入流的输入。

[jerry]$ sed '' 

当上面的代码执行时,会产生如下结果。

There is only one thing that makes a dream impossible to achieve: the fear of failure. 
There is only one thing that makes a dream impossible to achieve: the fear of failure.

在这里,第一行是通过键盘输入的,第二行是 SED 生成的输出。 要退出 SED 会话,请按 ctrl-D (^D)。