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

bar*_*lop 2 sed

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

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

什么时候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.

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

Pau*_*ce. 5

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

考虑以下输入文件:

aaa
bbb
ccc
ddd
eee
Run Code Online (Sandbox Code Playgroud)

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

s/./X/
Run Code Online (Sandbox Code Playgroud)

结果:

Xaa
Xbb
Xcc
Xdd
Xee
Run Code Online (Sandbox Code Playgroud)

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

3s/./X/
Run Code Online (Sandbox Code Playgroud)

结果:

aaa
bbb
Xcc
ddd
eee
Run Code Online (Sandbox Code Playgroud)

$as 的地址$s/./X/将以相同的方式起作用,但是对于最后一行(不管行数).

这是一个双地址命令.在这种情况下,它根据内容选择行.单个地址命令也可以执行此操作.

/b/,/d/s/./X/
Run Code Online (Sandbox Code Playgroud)

结果:

aaa
Xbb
Xcc
Xdd
eee
Run Code Online (Sandbox Code Playgroud)

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

这是一个sed在接收和处理后立即打印每一行的演示:

for i in {1..3}; do echo aaa$i; sleep 2; done | sed 's/./X/'
Run Code Online (Sandbox Code Playgroud)

模式空间(和保持空间)的容量与它可以容纳的字符数(并且取决于实现)有关,而不是与输入行的数量有关.分隔这些线的换行符只是该总数中的另一个字符.该G命令只是将一个保持空间的副本附加到模式空间的末尾.该G命令的多个应用程序附加了许多副本.

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

来自info sed:

3.1"sed"的工作原理

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

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

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

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