模式空间
在上一篇Sed&awk笔记之sed篇:简单介绍中,我们曾经介绍过简单的sed处理流程,这里首先回顾下:
- 读入新的一行内容到缓存空间;
- 从指定的操作指令中取出第一条指令,判断是否匹配pattern;
- 如果不匹配,则忽略后续的编辑命令,回到第2步继续取出下一条指令;
- 如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第2步继续取出下一条指令;
- 当所有指令都应用之后,输出缓存行的内容;回到第1步继续读入下一行内容;
- 当所有行都处理完之后,结束;
由此可见,sed并非是将一个编辑命令分别应用到每一行,然后再取下一个编辑命令。恰恰相反,sed是以行的方式来处理的。另外一方面,每一行都是被读入到一块缓存空间,该空间名为模式空间(pattern space),这是一个很重要的概念,在后文中会多次被提及。因此sed操作的都是最初行的拷贝,同时后续的编辑命令都是应用到前面的命令编辑后输出的结果,所以编辑命令之间的顺序就显得格外重要。
简单例子
让我们来看一个非常简单的例子,将一段文本中的pig替换成cow,并且将cow替换成horse:
$ sed 's/pig/cow/;s/cow/hores/' input