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