什么阶段印有sed的图案空间?

时间:2011-01-12 11:35:13

标签: sed

我听说过对于模式空间,最大地址数是2。

并且sed遍历文本文件的每一行,并且对于每个行,都会遍历脚本表达式或脚本文件中的所有命令。

什么时候打印图案空间?在完成最后一行之后,它是在文本文件的末尾吗?或者它是处理文本文件的每一行的结束部分,就在它运行所有命令之后,它会转储模式空间?

任何人都可以证明 a)图案空间的最大限制为2? b)印刷图案空间的事实。而且,如果可以的话,请提供一个说明的文字来源。

为什么我试图看到模式空间的大小,看起来它可以适应很多..

当本教程说明时 http://www.thegeekstuff.com/2009/12/unix-sed-tutorial-7-examples-for-sed-hold-and-pattern-buffer-operations/
Sed G功能
G功能将保持区域的内容附加到模式空间的内容。前和新内容由换行符分隔。最大地址数为2。

我发现的关于模式空间大小的一个例子,尝试看到它的两个限制失败了。 abc.txt是一个只有字符z
的文本文件 sed h; G; G; G; G; G; G; G; G abc.txt
打印很多zs所以我猜它可以容纳超过2 所以我误解了一些事情。

1 个答案:

答案 0 :(得分:5)

地址是一种选择线的方式。可以使用零个,一个或两个地址选择行。这与模式空间的容量无关。

考虑以下输入文件:

aaa
bbb
ccc
ddd
eee

sed命令的地址为零,因此它处理每一行:

s/./X/

结果:

Xaa
Xbb
Xcc
Xdd
Xee

此命令有一个地址,它只选择第三行:

3s/./X/

结果:

aaa
bbb
Xcc
ddd
eee

$中的$s/./X/地址的功能相同,但是最后一行(不管行数)。

这是一个双地址命令。在这种情况下,它根据内容选择行。单个地址命令也可以这样做。

/b/,/d/s/./X/

结果:

aaa
Xbb
Xcc
Xdd
eee

在给定显式pP命令时或当输入文件的当前行的脚本完成时(包括使用{{结束文件处理),将打印模式空间1}} command)如果没有q(禁止自动打印)选项。

以下是-n在接收和处理每行后立即打印的演示:

sed

模式空间(和保持空间)的容量与它可以容纳的字符数(并且取决于实现)有关,而不是与输入行的数量有关。分隔这些线的换行符只是该总数中的另一个字符。 for i in {1..3}; do echo aaa$i; sleep 2; done | sed 's/./X/' 命令只是将一个保留空间的副本附加到模式空间的末尾。 G命令的多个应用程序附加了许多副本。

在您链接到的教程中,语句“最大地址数为2”。有点暧昧。这表示您可以使用零个,一个或两个地址来选择要将该命令 应用于 的行。如上例所示,您可以将G应用于所有行,一行或一系列行。每个命令可以接受零,零或一个,或零,一个或两个地址。请参阅“概要”部分下的man sed,了解按照所接受的地址数对命令进行分组的子标题。

来自info sed

  

3.1“sed”如何运作

     

'sed'维护两个数据缓冲区:活动模式空间,以及   辅助保持空间。两者最初都是空的。

     

'sed'通过在每行上执行以下循环来运行   输入:首先,'sed'从输入流中读取一行,删除任何一行   尾随换行符,并将其放在模式空间中。然后命令   执行;每个命令都可以有一个与之关联的地址:   地址是一种条件代码,只执行命令   如果在执行命令之前验证了条件。

     

当到达脚本结尾时,除非'-n'选项在   使用时,模式空间的内容将打印出来输出   stream,如果它被删除则添加回尾线。(1)然后   下一个循环开始下一个输入行。

     

除非使用特殊命令(如“D”),否则模式空间为   在两个周期之间删除。另一方面,保持空间保持不变   它在循环之间的数据(参见命令'h','H','x','g','G'移动   两个缓冲区之间的数据。)