我听说对于模式空间,最大地址数是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个以上.
所以我误解了一些东西.
地址是一种选择线的方式.可以使用零个,一个或两个地址选择行.这与模式空间的容量无关.
考虑以下输入文件:
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)
如果没有(禁止自动打印)选项,则在给定显式p
或P
命令或当输入文件的当前行的脚本完成时(包括使用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'以在两个缓冲区之间移动数据).