📅  最后修改于: 2020-10-16 06:12:06             🧑  作者: Mango
在本章中,我们将探讨SED的工作原理。要成为SED的专家用户,必须了解其内部。 SED遵循简单的工作流程:读取,执行和显示。下图描述了工作流程。
读取:SED从输入流(文件,管道或标准输入)读取一行并将其存储在其内部缓冲区(称为模式缓冲区)中。
执行:将所有SED命令依次应用到模式缓冲区。默认情况下,除非指定行寻址,否则SED命令将应用于所有行(全局)。
显示:将(修改的)内容发送到输出流。发送数据后,模式缓冲区将为空。
重复上述过程,直到文件耗尽。
模式缓冲区是SED使用的专用,内存中易失性存储区域。
默认情况下,所有SED命令都应用于模式缓冲区,因此输入文件保持不变。 GNU SED提供了一种就地修改输入文件的方法。我们将在后面的部分中对此进行探讨。
还有另一个称为保持缓冲区的存储区,它也是专用的内存中易失性存储区。数据可以存储在保持缓冲区中,以备以后检索。在每个周期结束时,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)。