Chinaunix首页 | 论坛 | 博客
  • 博客访问: 325624
  • 博文数量: 63
  • 博客积分: 2344
  • 博客等级: 大尉
  • 技术积分: 628
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-13 11:09
个人简介

有一种沉默叫霸气,有一种内敛叫个性,有一种简单叫深遂,有一种不屑叫自我

文章分类

全部博文(63)

文章存档

2013年(10)

2012年(12)

2011年(1)

2010年(9)

2009年(31)

分类: LINUX

2009-09-09 10:42:54

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的奥秘吧!
 
阅读(1018) | 评论(0) | 转发(0) |
0

上一篇:vi替换命令

下一篇:linux下SSH传输文件

给主人留下些什么吧!~~