SED :流编辑器(stream editor)缩写

更新时间:2024-09-21 03:17

sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的东西存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed3.02。

历史沿革

sed是为命令行处理数据文件而构建的早期unix命令之一,首次出现在Version 7 Unix中。它是贝尔实验室的李·E·麦克马洪于1973年至1974年开发的,基于交互式编辑器ed(“editor”,1971)和早期qed(“quick editor”,1965-66)的脚本功能。sed是最早支持正则表达式的工具之一,至今仍然用于文本处理,特别是用于替换命令。sed的语法,特别是把/用于模式匹配,把s///用于替换,起源于sed的前身ed(当时ed很常用)而且正则表达式语法影响了其他一些语言,特别是ECMAScriptPerl。GNU sed添加了一些新功能,包括文件的就地编辑。Super-sed 是sed的扩展版本,包含与Perl兼容的正则表达式。sed的另一变体minised,最初由埃里克·雷蒙通过逆向工程写成,目前由René Rebe维护。在GNU计划基于新的GNU正则表达式库编写了新版本的sed之前,GNU计划一直使用minised。当前minised包含一些BSD sed的扩展,但不像GNU sed那样功能丰富。它的优点是速度快,占用的内存少。它用于嵌入式系统,是MINIX提供的sed版本。

软件介绍

sed是stream editor的缩写。是一个非交互式上下文(context)编辑器,它被设计在下列三种情况下发挥作用:

编辑那些对舒适的交互式编辑而言太大的文件。

在编辑命令太复杂而难于在交互模式下键入的时候编辑任何大小的文件。

要在对输入的一趟扫描中有效的进行多个‘全局’(global)编辑函数。

因为每次只把输入的某些行驻留在内存中,并且不使用临时文件,所以可编辑的文件的有效大小,只受限于输入和输出要同时共存于次级存储的要求。

可以单独的建立复杂的编辑脚本并作为给 sed 的命令文件。对于复杂的编辑,这节省了可观的键入和随之而来的错误。从命令文件运行 sed 高效于作者所知道的任何交互式编辑器,甚至包括能用预先写好的脚本驱动的编辑器。

相较于交互式编辑器而言,根本性的损失是缺乏相对地址(由于操作是每次一行的),和缺乏对命令如期运行的立即验证。

sed 是 UNⅨ编辑器ed 的直系后代。由于在交互式和非交互式操作之间的差异,在 ed 和 sed 之间已经有了可观的变化;甚至 ed 的惯常用户都会经常感到惊讶(并可能气愤),如果他们没有阅读本文档的章节 2 和 3,就草率的使用 sed 的话。在两个编辑器之间最显著的家族性共同之处,在于他们所识别的模式(‘正则表达式’)的种类;匹配模式的代码可以从 ed 的代码几乎原封不动的复制过来,在章节 2 中对正则表达式的描述就是从 UNⅨ Programmer’s Manual 几乎原封不动的复制过来的。

sed是一个面向行的文本处理实用程序:它从输入流或文件中逐行读取文本到一个称为模式空间的内部缓冲区。每读一行开始一个循环。对于模式空间,sed会应用sed脚本指定的一个或多个操作。sed实现了一种编程语言,其中包含大约25个指定文本操作的命令。对于每个输入行,在运行脚本之后,sed通常输出模式空间(由脚本修改的行),然后从下一行再次开始循环。其他脚本结束行为可通过sed选项和脚本命令获得,例如d删除模式空间,q退出,N立即将下一行添加到模式空间,等等。因此,sed脚本对应于循环体,循环体遍历流的行,其中循环本身和循环变量(当前型号)是隐式的并由sed维护。

主要功能

定址

可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号(正则表达式或者二者结合的方式确定。

用法和示例

sed的命令可以在命令行上指定(-e选项),也可以从单独的文件中读取(-f选项)。sed脚本中的命令可以采用行号或正则表达式作为地址。该地址确定决定命令何时运行。例如,2d将仅在第二个输入行上运行d(删除)命令(打印除第二个输入行之外的所有行),而/^ /d将删除以空格开头的所有行。一些单独的特殊缓冲区,即保持空间,可以由几个sed命令使用,用于在循环之间保持和累积文本。sed的命令语言只有两个变量(“保持空间”和“模式空间”)和类似GOTO的分支功能;然而,这种语言是图灵完备的,用深奥sed脚本甚至写得出推箱子、打砖块、国际象棋和趣味俄罗斯方块等游戏。

sed通常用作管道中的过滤器,例如:

generateData | sed 's/x/y/g'

这意味着,诸如“generateData”之类的程序生成数据,然后用sed把x替换成y。例如:

$ echo xyz xyz | sed 's/x/y/g'

yyz yyz

将几个sed命令(每行一个命令)放入脚本文件(例如subst.sed)中然后使用-f选项从文件中运行命令(例如s/x/y/g)通常很有用:

sed -f subst.sed inputFileName \u003e outputFileName

可以在脚本文件中放置任意数量的命令,使用脚本文件也可以避免shell转义或替换的问题。

参考资料

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}
友情链接: