免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 734 | 回复: 0
打印 上一主题 下一主题

简明 扼要学sed [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-24 18:04 |只看该作者 |倒序浏览

                                                                5.1.1. 什么是sed?
                        
                     
                  
               
               
流编辑器 是用来从文件读取文本或者从管道实现基本的变化。结果送到标准输出。 sed 命令的语法不指定输出文件,但是结果可以通过使用输出重定向来写入到文件中。编辑器并不改变原来的文件。
               
               
sed 和其它编辑器比如 vi 和 sed的区别在于它能够过滤来自管道的输入。在编辑器运行的时候你不要去干涉它;所以 sed常常被称作 批编辑器 。此特性允许你在脚本中使用编辑命令,极大的方便了重复性编辑任务。当面对文件中大量的文本替换的时候, ed 将是一个极大的帮助。
               
            
            
               
                  
                     
                        5.1.2. sed命令
                        
                     
                  
               
               
sed 程序可以通过使用正则表达式来实现文本的模板替换和删除,就和使用 grep 一样,见
第 4.2 节 “使用grep的例子”

               
               
编辑命令和 vi 编辑器的命令很相近:
               
               表 5.1. Sed编辑命令
                  
                     
                        
                        
                     
                     
                        
                           命令
                           结果
                        
                     
                     
                        
                           a\
                           在当前行后面增加文本。
                        
                        
                           c\
                           用新的文本替换当前行。
                        
                        
                           d
                           删除文本。
                        
                        
                           i\
                           在当前行之前插入文本。
                        
                        
                           p
                           打印文本。
                        
                        
                           r
                           读取一个文件。
                        
                        
                           s
                           搜索并且替换文本。
                        
                        
                           w
                           写入一个文件。
                        
                     
                  
               
               
除了编辑命令,你也可以给 sed加上选项。见下表:
               
               表 5.2. Sed选项
                  
                     
                        
                        
                     
                     
                        
                           选项
                           效果
                        
                     
                     
                        
                           -e SCRIPT
                           把SCRIPT指定的命令加入到在处理输入的时候运行的系列命令。
                        
                        
                           -f
                           把包含在 SCRIPT-FILE 文件中的命令加入到处理输入的时候运行的系列命令之中。
                        
                        
                           -n
                           安静模式。
                        
                        
                           -V
                           打印版本信息然后退出。
                        
                     
                  
               
               
sed info页面包含更多信息;这里我们只列出了最常用的命令和选项。
多个查sed命令用单独选项 -e 来隔开:
删除命令 d
sed '/abc/d' myfile    删除myfile文件中包含单词abc的所有行
查找替换命令 s
sed 's/oldword/newword/g' myfile 所myfile 文件中所有oldword单词替换成newword,其中g为全局选项,否则只执行第一次匹配的替换。
$ sed -e '1,10d' /etc/services  删除1,到10行 $ sed -e '1,10s/old/new/g' myfile2.txt  在1到10中用'old'替换所有出现 'new'
$ sed -e '/^$/,/^END/s/hills/mountains/g' myfile3.txt
该例将用 'mountains' 替换 'hills',但是,只从空行开始,到以三个字符 'END' 开始的行结束(包括这两行)的文本块上这样做。
关于 's///' 命令的另一个妙处是 '/'
分隔符有许多替换选项。如果正在执行字符串替换,并且规则表达式或替换字符串中有许多斜杠,则可以通过在 's'
之后指定一个不同的字符来更改分隔符。例如,下例将把所有出现的 /usr/local 替换成 /usr:
$ sed -e 's:/usr/local:/usr:g' mylist.txt
在该例中,使用冒号作为分隔符。如果需要在规则表达式中指定分隔符字符,可以在它前面加入反斜杠。
规则表达式混乱
                       
      
目前为止,我们只执行了简单的字符串替换。虽然这很方便,但是我们还可以匹配规则表达式。例如,以下 sed 命令将匹配从 '' 结束、并且在其中包含任意数量字符的短语。下例将删除该短语(用空字符串替换):
                       
      
$ sed -e 's///g' myfile.html  
                       
      
这是要从文件除去 HTML 标记的第一个很好的 sed 脚本尝试,但是由于规则表达式的特有规则,它不会很好地工作。原因何在?当 sed 试图在行中匹配规则表达式时,它要在行中查找
        最长的匹配。在我的
        
前一篇 sed 文章
中,这不成问题,因为我们使用的是 'd' 和 'p' 命令,这些命令总要删除或打印整行。但是,在使用 's///' 命令时,确实有很大不同,因为规则表达式匹配的整个部分将被目标字符串替换,或者,在本例中,被删除。这意味着,上例将把下行:
      
                       
      
This is what I meant.  
                       
      
变成:
                       
      
meant.  
                       
      
我们要的不是这个,而是:
                       
      
This is what I meant.  
                       
      

运的是,有一种简便方法来纠正该问题。我们不输入“''
字符结束”的规则表达式,而只需输入一个“'' 字符并以 '>'
字符结束”的规则表达式。这将与最短、而不是最长的可能性匹配。新命令如下:
                       
      
$ sed -e 's/]*>//g' myfile.html
                       
      
在上例中,'[^>]' 指定“非 '>'”字符,其后的 '*' 完成该表达式以表示“零或多个非 '>' 字符”。对几个 html 文件测试该命令,将它们管道输出到 "more",然后仔细查看其结果。
                       
      




回页首
更多字符匹配
                       
      
'[ ]' 规则表达式语法还有一些附加选项。要指定字符范围,只要字符不在第一个或最后一个位置,就可以使用 '-',如下所示:
                       
      
'[a-x]*'
                       
      
这将匹配零或多个全部为 'a'、'b'、'c'...'v'、'w'、'x' 的字符。另外,可以使用 '[:space:]' 字符类来匹配空格。以下是可用字符类的相当完整的列表:
                       
      
                                               
            字符类
                                       
         
                                               
            描述
                                       
          [:alnum:]字母数字 [a-z A-Z 0-9][:alpha:]字母 [a-z A-Z][:blank:]空格或制表键[:cntrl:]任何控制字符[:digit:]数字 [0-9][:graph:]任何可视字符(无空格)[:lower:]小写 [a-z][:print:]非控制字符[:punct:]标点字符[:space:]空格[:upper:]大写 [A-Z][:xdigit:]十六进制数字 [0-9 a-f A-F]
                       
      
尽可能使用字符类是很有利的,因为它们可以更好地适应非英语 locale(包括某些必需的重音字符等等).
http://www-128.ibm.com/developerworks/cn/linux/shell/sed/sed-1/index.html
http://www-128.ibm.com/developerworks/cn/linux/shell/sed/sed-2/index.html
http://www-128.ibm.com/developerworks/cn/linux/shell/sed/sed-3/index.html
            
               
               
               
               
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/553/showart_220471.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP