III Linux系统编程_ 32正则表达式_3 sed.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:4 大小:39KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

III Linux系统编程_ 32正则表达式_3 sed.doc

IIILinux系统编程_32正则表达式_3sed.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第32章正则表达式3.sedsed意为流编辑器(StreamEditor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出。sed和vi都源于早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的。sed命令行的基本格式为sedoption'script'file1file2...sedoption-fscriptfilefile1file2...sed处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,命令行参数可以一次传入多个文件,sed会依次处理。sed的编辑命令可以直接当命令行参数传入,也可以写成一个脚本文件然后用-f参数指定,编辑命令的格式为/pattern/action其中pattern是正则表达式,action是编辑操作。sed程序一行一行读出待处理文件,如果某一行与pattern匹配,则执行相应的action,如果一条命令没有pattern而只有action,这个action将作用于待处理文件的每一行。表32.5.常用的sed命令/pattern/p打印匹配pattern的行/pattern/d删除匹配pattern的行/pattern/s/pattern1/pattern2/查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2/pattern/s/pattern1/pattern2/g查找符合pattern的行,将该行所有匹配pattern1的字符串替换为pattern2使用p命令需要注意,sed是把待处理文件的内容连同处理结果一起输出到标准输出的,因此p命令表示除了把文件内容打印出来之外还额外打印一遍匹配pattern的行。比如一个文件testfile的内容是123abc456打印其中包含abc的行$sed'/abc/p'testfile123abcabc456要想只输出处理结果,应加上-n选项,这种用法相当于grep命令$sed-n'/abc/p'testfileabc使用d命令就不需要-n参数了,比如删除含有abc的行$sed'/abc/d'testfile123456注意,sed命令不会修改原文件,删除命令只表示某些行不打印输出,而不是从原文件中删去。使用查找替换命令时,可以把匹配pattern1的字符串复制到pattern2中,比如:$sed's/bc/-&-/'testfile123a-bc-456pattern2中的&表示原文件的当前行中与pattern1相匹配的字符串,再比如:$sed's/\([0-9]\)\([0-9]\)/-\1-~\2~/'testfile-1-~2~3abc-4-~5~6pattern2中的\1表示与pattern1的第一个()括号相匹配的内容,\2表示与pattern1的第二个()括号相匹配的内容。sed默认使用Basic正则表达式规范,如果指定了-r选项则使用Extended规范,那么()括号就不必转义了。如果testfile的内容是<html><head><title>HelloWorld</title><body>Welcometotheworldofregexp!</body></html>现在要去掉所有的HTML标签,使输出结果为HelloWorldWelcometotheworldofregexp!怎么做呢?如果用下面的命令$sed's/<.*>//g'testfile结果是两个空行,把所有字符都过滤掉了。这是因为,正则表达式中的数量限定符会匹配尽可能长的字符串,这称为贪心的(Greedy)[HYPERLINK"../拷给小宋/LinuxC编程一站式学习/html-chunk/ch32s03.html"\l"ftn.id2880730"39]。比如sed在处理第一行时,<.*>匹配的并不是<html>或<head>这样的标签,而是<html><head><title>HelloWorld</title>这样一整行,因为这一行开头是<,中间是若干个任意字符,末尾是>。那么这条命令怎么改才对呢?留给读者思考。[HYPERLINK"../拷给小宋/LinuxC编程一站式学习/html-chunk/ch32s03.html"\l"id2880730"39]有些正则表达式规范支持Non-greedy的数量限定符,匹配尽可能短的字符串,例如在Python中*?和*一样表示0个或任意多个,但前者是Non-greedy的。