免费注册 查看新帖 |

Chinaunix

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

sed编辑器 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-09 10:42 |只看该作者 |倒序浏览
sed是什么
sed是linux自带的一种流编辑实用工具。但是她是非交互的(必须将要对数据执行的命令插入到命令行或要处理的脚本中)。sed 在一个文件(或文件集)中非交互式、并且不加询问地接收一系列的命令并执行它们。
sed能干什么
举个例子,在你编辑的一篇英文文本中,由于出于某种需要,需要将所有的空格替换成‘:’,你是要手动改吗?当然,手动改可以实现,但是你可以想象这个过程的boring程度(单词之间都要修改)。sed要怎么操作呢?“$sed s/ /:/g filename > newfile修改完的文件就生成了。这只是sed流编辑器的功能之一,想知道sed的其他功能,follow me。
sed功能展示
1. sed语法
   sed [options] '{command}' [filename]
2. 替换,s命令
   命令形式:'s/{oldstring}/{newstring}/'
   语法形式跟vi里的替换命令很相似,不熟悉的可以参看一下我博客里的vi替换命令。
   $ echo The tiger cubs will meet on Tuesday after school | sed 's/tiger/wolf/'
   The wolf cubs will meet on Tuesday after school
   $
3. 多次替换
   如果需要多次替换,可以三种命令方式来实现
   a. -e选项,该选项通知sed使用了多条编辑命令
      $ echo The tiger cubs will meet on Tuesday after school | sed -e 's/tiger/wolf/' -e 's/after/before/'
      The wolf cubs will meet on Tuesday before school
      $
   b. 相对简单的实现使用‘;’
      $ echo The tiger cubs will meet on Tuesday after school | sed '
s/tiger/wolf/; s/after/before/'
      The wolf cubs will meet on Tuesday before school
      $
   注:‘;’要紧跟‘/’后,不要出现空格。
   应该注意到这里出现了'',''之间的内容被解释为sed的命令,当输入第一'时,shell会期待第二个'的出现,在第二个'后输入回车,才会执行sed命令。由此出现第三种方式。
   c.
   $ echo The tiger cubs will meet on Tuesday after school | sed '
   > s/tiger/wolf/
   > s/after/before/'
   The wolf cubs will meet on Tuesday before school
   $
4. 全局修改,g选项
   当你的文本中出现多个{oldstring}的时候,用上面的命令时发现每行中只有第一次出现的地方会被替换,那怎样实现替换所有的呢?选项g来完成。在每条s/{oldstring}/{newstring}/最后加上g,就会将该行中所有的oldstring替换掉。
5. 精确修改,符号/
   当你需要修改含有特定内容的行时,在修改命令前加/keyword/ sed command。
   $sed /tiger/ s/tiger/wolf/g sample_txt
   该命令将修改所有含有tiger的行,并且修改该行中所有tiger
以上讲的都是sed的替换工作,那sed还有其他的功能吗?当然!
6. 打印,p命令
   [地址范围]/p:显示地址范围内的所有行。
   当然了,这里的地址范围可以是5,10的形式,表示显示从5行到10行的内容;也可是/keyword/匹配关键字的行的内容。
7. 删除,d命令
   删除功能当然也是sed必备的了,形式:[地址范围]/d
'10d'
删除输入的第10行
'1,3 d'
删除1-3行
'/^two/ d'
删除以two开头的行(^表示一行的开始)
'/two$/ d'
删除以two结尾的行(^表示一行的结尾或文件的结尾)
'/^$/ d'
删除空白行(^和$之间没有任何内容)
'1,/^$/ d'
删除从第一行开始到第一个空白行的内容
'/two/ d'
删除包含two的所有行
'/two/ !d'
删除不包含two的所有行
8. 对文件的操作
   a. 向文本里添加你的内容,a命令
      '3a\ context' filename:在第三行后加入一行。(\表示换行)
      '$a\ context' filename:在文件结束的地方加入一行
      '/keyword/ a\ context' filename:在含有关键字的行的后面添加一行
   b. 向文本里插入你的内容,i选项
      用法跟上面一样,只是这里会在你感兴趣的行的地方插入你的内容,而不是行的后面。
   
   c. 写文件(非重定向),w命令
      '1,3 w newfile' oldfile:将oldfile中的1-3行的内容写入newfile,如果newfile不存在会自动创建之,如果newfile已经存在则会重写newfile里的内容。
      '/keyword/ w newfile' oldfile:理解这条语句应该没问题了吧!
   不觉得用这个命令来提取自己感兴趣的信息很好用吗?
   d. 修改,c命令
      这里的修改不是s的效果。s只是替换相应的字符串,c则替换这个行
      '1,3 c\ context' filename:将1-3行的所有的内容替换成一行的context,而不是3行
      '/keyword/ c\ context' filename:将匹配关键字的行替换成context
   e. 提前退出,q命令
      'sedcommand 8q' filename:sed操作执行到第八行的时候停止退出
      'sedcommand /keyword/ q' filename:sed操作执行完第一次含有keyword的行后,停止退出
9. sed脚本,-f选项
   如果你觉得每次在shell中输入命令很不方便,而且这个命令要重复执行很多次,那么,就应该先编写一个sed脚本,每次执行脚本就好了。
   $ cat sedlist
   /two/ s/1/2/
   /three/ s/1/3/
   $
   怎么执行这个脚本呢? sed -f sedlist filename就可以了。你可以在脚本里写下你的密令尽情的折腾文件了,呵呵。
注:sedlist内的命令不需要用'号。

今天就先到这里吧,像标签申明(:标签名)、标签操作(b {label}:处理跳转至label处或文件尾;t {label}:只要自上次输入行或执行一次 "t" 命令以来进行了替换操作,就转至该标签或文件尾)都没有用到呢,等以后继续发掘sed的奥秘吧!



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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP