Sed - 工作流程

  • 简述

    在本章中,我们将探讨 SED 究竟是如何工作的。要成为专家级 SED 用户,需要了解其内部结构。SED 遵循一个简单的工作流程:读取、执行和显示。下图描述了工作流程。
    流编辑器工作流程
    • Read: SED 从输入流(文件、管道或标准输入)中读取一行并将其存储在其内部缓冲区中,称为pattern buffer.
    • Execute:所有 SED 命令都按顺序应用于模式缓冲区。默认情况下,除非指定了行寻址,否则 SED 命令将应用于所有行(全局)。
    • Display:将(修改后的)内容发送到输出流。发送数据后,模式缓冲区将为空。
    • 重复上述过程,直到文件用完。
  • 注意事项

    • 模式缓冲区是 SED 使用的私有内存中易失性存储区域。
    • 默认情况下,所有 SED 命令都应用于​​模式缓冲区,因此输入文件保持不变。GNU SED 提供了一种就地修改输入文件的方法。我们将在后面的部分中探讨它。
    • 还有一个内存区域叫做hold buffer这也是私有的、内存中的、易失性的存储区域。数据可以存储在保持缓冲区中以供以后检索。在每个周期结束时,SED 删除模式缓冲区的内容,但保持缓冲区的内容在 SED 周期之间保持不变。但是 SED 命令不能直接在保持缓冲区上执行,因此 SED 允许在保持缓冲区和模式缓冲区之间移动数据。
    • 最初,模式和保持缓冲区都是空的。
    • 如果没有提供输入文件,则 SED 接受来自标准输入流 (stdin) 的输入。
    • 如果默认情况下未提供地址范围,则 SED 对每一行进行操作。

    例子

    让我们创建一个文本文件quote.txt引用著名作家保罗·科埃略的名言。
    
    [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
    
    执行上述代码时,会产生如下结果。
    
    [jerry]$ sed '' quote.txt
    
    在上面的示例中,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)。