文本工具箱——“sed”篇
文本工具箱——“sed”篇
鉴于旧Blog已经删了,新Blog上的前几篇将是旧Blog上帖过的文章。首先是:文本工具箱——“sed”篇(原名:我喜爱的工具——编辑器篇:sed)。与原来的相比会做一些更动
–
hq00e
什么是SED?简单来说,SED是个编辑器。就像Windows下的记事本一样是用来编辑文本的,但是从操作方式来看它是个很特殊的编辑器!sed(Stream EDitor)是“流编辑器”的意思。最早是Unix平台的工具,但已经被移植到各个平台上了。它有两个主要的属性:
一它是个编辑器; 二它这个编辑器是面向“流”的。
名称:SED (Stream EDitor)
描述:命令行下运行的流编辑器
平台:Unix,Linux,MacOS,Windows,DOS,……
大小:根据平台和版本的不同从13KB-200KB不等(超过100K的一般都是加了多语言支持的)
PS:sed的版本有很多样,推荐使用GNU sed(gsed)或在gsed基础上修改的支持perl正则表达式的ssed。不同的版本对表达式,及表达式使用的细节上有些不同,如hhsed和csed不严格执行最左侧最大长度匹配原则,Pattern Space和Hold Space的支持的大小也不同,这些细节在使用时要注意。
下载:http://sed.sourceforge.net/#download 在这里可以找到不同版本的SED下载
Unix和Linux一般已带有sed,鉴于Windows平台上编译SED不方便,加上不容易找这里找供一个ssed的下载地址
- 首先,它是个编辑器,它的用途便是对文本进行编辑。对一些重复性的编辑工作而言sed可以为你节省很多时间。
- 其次,它是面向流的。它的工作流程为:读入行,处理,移到下一行,读入行,处理,移到下一行……并且这个过程是依你所给的命令(或脚本)自动进行的。在这个编辑过程中文本以行为单位不断的移动(读入)就如同水在流动一般,因而称为流编辑器。不过你也许更喜欢这个解释:它支持管道操作接受前一个命令的输出作为sed的输入并写入至标准输出(通过管道操作,这又可以成为下一个命令的输入),就像是工厂的流水线一样,所以叫它流编辑器。此外,它是据给定的命令或脚本“自动”逐行处理文本的,这意味着它是非交互式的编辑器——在它处理的过程中不须人工干预。
1 与交互式编辑器的不同:
- 它是非交互式的,所有的操作必须以命令(脚本)的方式给出。交互式编辑器让你可以即时的看到结果并对其修改,现在的交互编辑器通常还有图形介面及菜单工具栏。
- 它是one pass,sed单向的处理文件流。除非读入多行到Pattern Space或Hold Space中,不然你没办法先处理第6行来修改第2行。
- 交互式编辑器可用来做一些不确定的和无规律的(但很多看似无规律的东东其实都系有规律的)编辑工作,如找找语病,检查文本——在开始之前并不知道那些地方要修改。但是如果你事先已经知道哪些地方要修改了,那也许可以考虑用sed。
2 它能做得到的交互式编辑器能做得到吗?
一部分可以。交互式用的是人工——双手万能!但很累而且没效率。而且当要处理的文件数量或文件大小超过了一定的范围后,要使用交互式编辑器来做编辑修改的工作就不大现实了。此外sed可以结合Unix下面的Shell编程或Win平台下的批处理与脚本编程中使用(主要是因为sed对管道操作的支持)从而将它的应用扩展到文本编辑以外的领域。
3 它的主要用途?它与ed、AWK或Perl的关系?
sed能做多种不同的编辑工作(还能用来玩游戏),但最经常的用途是用做“批量查找替换”的工具。
既然你读了这篇文章那也许你没听过ed、AWK,但是如果你想了解SED的话ED和AWK也应该了解一下。
ed是Linux下的行编辑器。它与sed很相似:它是命令行工具、支持正则表达式、与SED相似的命令、支持脚本。不同的是ed是交互式编辑器同时它缺少作为一种编程语言所需的控制结构。而且对于同样的任务而sed通常要比ed快。
Perl是一种通用语言。你几乎可以用Perl来做任何事,因为Perl的一些特性使得它同样适合作命令行的文本编辑器。
AWK相较sed而言是一种更完整的编程语言。含有更多编程特性如变量、数组、函数等。它与SED的命令结构相似。
很多人认为AWK可以完成SED可以完成的所有任务所以不需要SED。但是正如我们不会因为Perl而不使用AWK或者因为SED而不用Head,Cut,Paste……等其他Unix文本工具一样,我们应该只用最适合的工具!话说回来AWK与SED还是很不一样的,在它们有不同的适用场合——不过这里不会有深度剖析。
4 为什么喜欢它?
效率: sed能将用户从重复的编辑中工作解放出来。如批量替换网页中的特定链接;整理出日志中来自特定IP段的访问记录;删除特定行等,用SED都可以轻易地完成。SED能读入脚本文件意味着一个脚本可以被重复用或者经过少量修改后就可以再次使用。SED的效率还来源于它支持管道操作(*这点非常重要*)能以上一个命令的输出作为输入,并将结果写回“标准输出”(通常是电脑屏幕),这表示SED可以方便地将处理完的结果传到下一个工具中。SED当然不是万能的,使用管道操作SED只要完成自己的那一部份工作然后传给下一个工具。最后,如果要从一个“大”文件中“抽取”一部份(符合式样的)文本的话,交互式编辑器光在打开文件时就要占用相当多的时间和磁盘空间了……
PS:就算是简单的替换而言,sed也能省下一些时间。比如要将“abc.txt”中的所有“hqooe”改为“hq00e”(中间是数字0不是字母o)。我只要在命令行下输入:sed "s/hqooe/hq00e/g" abc.txt > abc2.txt。而在交互式的编辑器中我需要先打开文件,运行“替换”,输入hqooe和hq00e,按“确定”,另存为abc2.txt,关闭编辑器。当然我不坚持这种情况下一定要用SED: )
乐趣:使用sed本身就是一种乐趣:你要事先想好要进行的操作并用脚本的形式写出来,试运行,修改,再运行……搞定。对一些编辑任务而言要使用非交互的方式来完成是有一定难度的如果此时还能写出一个可行的SED脚本(AWK也一样)的话会——非常有成就感!此时完成任务成了一种享受。而使用交互式工具的话,意味着你舍弃了用一种更优雅的方式完成任务的可能性,完成任务只是一种体力活(如果文件够大的话)。
PS:Greg Ubben用sed写了一个计算器;还有很多人写了SED的游戏——请注意SED只是一个流编辑器。想知道他们是怎么做的吗?看下这个网址:http://sed.sourceforge.net/grabbag/
成本:sed是开源的,自由的。简单说就是SED是免费的。
空间成本:不同版本的sed大小不尽相同但大一点的也就180K左右基本不占磁盘空间。没有图形介面以省下了不少屏幕空间和内存:-)
学习成本:sed的学习成本几乎都在“正则表达式”上,但学了正则表达式后你可以在支持“正则表达式”的其他的编辑器上(如Vim、UltraEdit32、EmEditor等——不过他们支持的正则表达式有些细微的差别),Perl,.NET编程和一大堆的GNU工具中使用。这样平摊下来学习成本也很低的。而且SED是跨平台的你现在学的无论你将来用的是Solaris、Linux、MacOS还是Win都能派上用场。
5 它的缺点?
SED的优点很明显缺点也是。最主要的缺点就是大部分人不用命令行来编辑文本。其次是很少人愿意花时间去学正则表达式。不过,好消息是SED相对AWK或C语言要容易得多。
6 sed的基本用法和一些使用的例子
sed可在命令行下直接输入使用SED命令,或将SED命令写成SED脚本在运行SED时读取脚本。
sed -e "命令" abc.txt
–>第一种:直接在SED后使用SED命令,在Unix平台下使用单引号而不是双引号。很多的sed版本允许省略前面的“-e”选项(开关)。
sed -f script.txt abc.txt
–>第二种:从脚本script.txt中读取SED命令,脚本文件其实也是文本文件,但它的扩展名是什么并不重要。使用脚本文件通常因为命令是比较复杂写在脚本中方便写也方便调试或者是命令经常要用到通过脚本可以方便的再次调用。
注意:sed 并不会对输入文件做任何的改动,在上面的例子中它只是读入abc.txt的内容处理然后输出到屏幕上,并不会改变abc.txt的内容。如果要保存修改的结果可以使用重定向操作符“>”。如“sed "命令" abc.txt > 新abc.txt”将修改的结果保存到“新abc.txt”中。
第一种用法的例子:
#删除文件中的所有空行
sed "/^$/d"
#abc.txt中所有的hqooe都替换成hq00e
sed "s/hqooe/hq00e/g"
#所有行缩进两格
sed "s/^/ /"
#显示包含“姚明”这个词的行
sed -n "/姚明/p"
#移除大多数的html标签
sed ":a;s/<[^>]*>//g;/</N;//ba"
第二种用法——脚本。脚本的例子较长,附录中的“sed百宝箱”中提供了许多经典的脚本。
7 如何学sed:
- 首先是参考资料。GNU SED的文档加上sed自带的帮助就差不多了。
- 学些简单的正则表达式和正则表达式中的一些常用字元(^$[]{}().*?\1)
- 再学几个常用命令 s、i、d、p 等
- 练习。在实践中练习。
- 遇到简单命令不能应付的任务,学更多命令。
- 不懂的话找人问问看。建议订阅sed的邮件列表。
订阅方式,发送空白邮件至 sed-users-subscribe@yahoogroups.com 退订邮件列表,发送空白邮件至 sed-users-unsubscribe@yahoogroups.com 这个邮件列表里有一群热心的sed用户会为你提供帮助。 当然如果能帮得上忙的话,我也很乐意帮忙的。
附录: 一些sed资源
- “The SED $HOME”有相当多的sed资源,必看
- GNU sed的在线文档
- sed的FAQ
- GNU sed的主页
- sed单行脚本(中文)——一些常用的脚本
- sed百宝箱——相当多的经典脚本
- sed邮件列表前面已经说了订阅的方式,也可以到下列地址查看: Yahoo groups
![hq00e[a]126.com](http://static.flickr.com/56/120355805_7079a475f9_m.jpg)



Sed 做的事情其实应该放到专用的脚本语言如 python,php 来做
Comment by dvaknheo — 2007, May 30 @ 19:44
-_-||| ms sed才是专用的脚本语言
Comment by krain — 2007, June 6 @ 01:20