已经看了一段时间的Linux Shell编程了,也能完成一些基本的使用,为了加深理解,刚好看到了The Unix School的一个sed&awk教程,不是简单的命令参数堆积,而是一个至关实用的系列,所以,但愿能在几天内完成翻译.翻译过程不会逐字翻译,会穿插一些注释,包括本身的一些理解和其余的一些引用,做为开篇,简单说一下sed的工做机制,对后面的理解会有很大帮助。html
sed是什么:正则表达式
sed是一个非交互式的流编辑器(stream editor)。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,而后在屏幕上查看输出;而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,而后对该行进行指定的处理,并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令),接着读入下一行。整个文件像流水同样被逐行处理而后逐行输出。(via Walk in Mindfields )编程
sed工做机制:编辑器
sed维护两个缓冲区,pattern space和hold space,命令开始执行以前都为空。测试
pattern space缓冲区用于临时保存每次读取的一行的内容,大部分的匹配和替换等等操做都是针对pattern space中的内容进行的,所以不会对输入文件有任何影响,而hold space则做为后备缓冲区使用,除非指定了一些特殊的命令(例如D删除命令),不然pattern space中的内容会在处理完一行以后清空,但hold space中的内容在处理完每一行时不会被删除。spa
也就是说pattern space至关于咱们的内存,hold space至关于硬盘.处理的时候在内存里,处理过的就放回硬盘.(这是个人理解,有一点点不恰当,可是所以一些概念会比较好理解.)命令行
具体来讲,能够大体分为如下几步:翻译
1.首先,从标准输入流读取一行,移除换行符,而后存入pattern space中htm
2.执行指定的命令,(每一个命令都有一个可选的地址(能够是行号,也多是一个正则表达式匹配),这个地址做为一个执行命令前的测试,指定了须要对那些行进行操做。当前行只有匹配的状况下才会执行命令。)教程
3.当指定全部的命令都执行完了以后,pattern space内容就被处理过了,sed默认会将pattern space中的内容打印到标准输出中,移除的换行符也会打印出来。本行操做完成。
4.而后sed会读取下一行的内容,再次执行相同的操做。直到行尾。
基本上最基础的理论就差很少了.主要是这个工做机制比较重要.后面从示例中慢慢加深理解.错误之处请你们指正.