两种空间介绍

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 命令。

-- By 许望(RHCA、OCM、VCP)
最后修改:2020 年 01 月 02 日 08 : 32 PM
如果觉得我的文章对你有用,请随意赞赏