两种空间介绍
sed 之所以能以行为单位地编辑文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“保持空间(hold space)。
模式空间:其实就是处理当前的活动工作场所。
保持空间:我们在进行数据处理的时候,可以用作数据的暂存区域。正常情况下,保持空间不会使用到。
sed 编辑器逐行处理文件,并将输出结果打印到屏幕上。sed 命令将当前行读入模式空间(pattern space),进行处理,显示。sed 处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理、显示,依次执行,直到处理完文件的最后一行,sed 便结束运行。sed 在模式空间对文件进行处理,所以不会修改原文件,除非显示指明 -i 选项。
一般情况下,数据的处理只使用模式空间(pattern space),按照如上的逻辑即可完成主要任务。但是某些时候,通过使用保持空间(hold space,也称暂存空间),还可以带来意想不到的效果。
注意:暂存空间里默认存储一个空行。使用保持空间的本质,是我们有了一个数据暂存区,可以用来做一些交换的算法。
与模式空间和暂存空间相关的命令
n 读取下一行替换当前模式空间的行。
N 读入下一行,追加到模式空间行后面,此时模式空间有两行。
h 把模式空间里的行拷贝到暂存空间,原暂存空间内容清除。
H 把模式空间里的行追加到暂存空间。
g 用暂存空间的内容替换模式空间的行。
G 把暂存空间的内容追加到模式空间的行后。
x 将暂存空间的内容与模式空间里的当前行互换。
d 删除模式空间中的所有行,并读入下一新行到模式空间中。
D 删除 multiline pattern 中的第一行,不读入下一行。
! 对所选行以外的所有行应用命令。
范例
范例1. 给每行结尾添加一行空行
暂存空间默认是一空行,所以将暂存空间的内容追加到模式空间即可
#sed 'G' /etc/passwd
范例2. 用sed模拟出tac的功能(倒序输出)
#sed '1!G;h;$!d' /etc/passwd
;表示行上有多个操作命令。自己在纸上画一下图就没明白是怎么回事儿了:
先从文件中取出第一行到模式空间,1!G:第1行不执行“G”命令,然后执行h,将第1行存入暂存空间,再执行d命令,删除模式空间中的内容;
从文件中取出第2行到模式空间,执行G将暂存空间中的内容即第一行追加到模式空间的后面,即第2行的后面,然后执行h,将模式空间的内容存入暂存空间,再执行d命令,删除模式空间的内容。
依次类推至最后一条……$!d:最后一行不执行 d 命令。