我听说过对于模式空间,最大地址数是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
所以我误解了一些事情。
答案 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
在给定显式p
或P
命令时或当输入文件的当前行的脚本完成时(包括使用{{结束文件处理),将打印模式空间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'移动 两个缓冲区之间的数据。)