Chinaunix首页 | 论坛 | 博客
  • 博客访问: 137346
  • 博文数量: 25
  • 博客积分: 389
  • 博客等级: 一等列兵
  • 技术积分: 838
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-23 14:18
文章存档

2013年(20)

2012年(5)

分类: LINUX

2012-07-09 18:20:35

  sed命令是流式编辑器(Stream EDitor)或行编辑器,工作在模式空间(pattern space),不操作源文件,只是把处理结果返回到屏幕上来,对源文件没有任何损害,sed命令默认支持正则表达式,也可以使用sed -r选项支持扩展正则表达式;
1、sed 的使用格式:
     sed [options] ‘script’ input_file...
              script指的是sed的脚本,input_file是被处理的文件;
     sed [options] -f script_file input_file...
             -f用来指定一个文件script_file(脚本文件);
     sed ‘ADDR1,ADDR2command’ input_file 对起始行和结尾行进行处理;
     sed ‘/PARTTERN/command’ input_file (PARTTERN指的是模式,只有模式
             匹配到的行才执行命令;
     sed ‘/PATTERN1/,/PATTERN2/’ input_file 表示从PATTERN1的第一个字符
             开始到PATTERN2第一个字符结尾;
2、sed 选项:
     sed -i 直接操作源文件;
     sed -n 静默模式,表示只显示处理以后的内容;
     sed -r 使用扩展正则表达式;
     sed -e 多点编辑,执行多个脚本,可以使用多个-e选项,或者使用一个-e选
             项,后面的脚本用分号隔开;
3、sed 的子命令:
     d 删除指定行;
     p 模式空间中的文本在处理之前,每一次都会先显示;
     ! 对命令取反;
     a \ 在模式匹配到的行后面添加新内容;
     i \ 在模式匹配到的行前面添加新内容;
     r FILE 读取FILE文件并且把FILE文件添加到某个文件中的某个特定位置;
     w FILE 把FILE文件中模式能够匹配到的所有的行保存到另一个文件中;
     y /string1/string2/ 把string1替换成string2;
     s /patren/string/表示把patren匹配出来的内容替换为string(其中的“/”
         有其特殊含义,所以使用时要注意转意,实际上可以替换为其它的无特殊
         意义的字符,下面举例我们将用@符号替换);      
       g 全局的,找到所有的匹配字符,如果不加的话只匹配第一次出现的内
容;
       i 做模式匹配忽略大小写;
       & 引用其前面的所有字符;
       n 下一行;模式空间中的文本在处理之前,每一次都会先显示;
     N 追加到下一行,sed命令每次读取一行,当第一行读取后会放到模式空间中 
       不处理然后接着读取第二行,读取完后将这两行一块处理,往下以此类推;
     h 将模式空间的内容以覆盖的方式复制到保留空间;
     H 将模式空间的内容以追加的方式复制到保留空间;
     g 将保留空间的内容以覆盖的方式复制到模式空间;
     G 将保留空间的内容以追加的方式复制到模式空间;
     b 跳转,略过符合模式的行;
     b label :label字符的长度不能超过7个;跳转到什么位置,其中的label是固
       定字符;
     x 保留空间和模式空间对调;
     t label 测试:前面的s命令执行成功了就跳转到标记位置;
     = 为每一行标记行号;
一、下面来详细讲解一下常用的命令或选项的用法及示例
d 删除指定行;
sed -i 选项会直接操作源文件,一定要慎用;
 
! 对命令取反,仍以fstab文件为例:
模式空间中的文本在处理之前,每一次都会先显示,也就是说每一行将会被显示
   两次,以fstab文件为例:
sed  -n 选项为静默模式,表示只显示处理以后的内容,处理以前的内容将不会被
    显示出来;仍以fstab文件为例;
sed ‘/PARTTERN/command’input_file (PARTTERN指的是模式,只有模式匹
   配到的行才执行命令,其中的模式同时支持grep的各种元字符;这里以脚本a.sh
   为例,删除以#开头的行:
i \ 在模式匹配到的行前面添加新内容,与a \正好是相反的结果;
a \ 在模式匹配到的行后面添加新内容;这里以脚本a.sh为例,在以包含#号的行
     的后面添加一些内容:
同时也可以利用\n实现添加多行,仍以a.sh为例,我们在上述的基础上再在后面添加一行内容:
r FILE 读取FILE文件并且把FILE文件添加到某个文件中的某个特定位置;这里以
        fstab和a.sh脚本文件为例,将fstab文件里的内容添加到a.sh脚本文件中
        的第二行后面:
w FILE 把FILE文件中模式能够匹配到的所有的行保存到另一个文件中;
   示例:把a.sh脚本文件中包含大写字母的行保存到/tmp/file.out这个文件中,
         注意w命执行时也会将模式空间中的文本在处理之前,每一次都会先显
         示,所以执行时我们加上sed的-n选
s  /patren/string/表示把patren匹配出来的内容替换为string(其中的“/”有
   其特殊含义,所以使用时要注意转意,实际上可以替换为其它的无特殊意义 的
   字符,下面举例我们将用@符号替换);
     g 全局的,找到所有的匹配字符,如果不加的话只匹配第一次出现的内容;
     i 做模式匹配忽略大小写; 
     & 引用其前面的所有字符;
     n 下一行;模式空间中的文本在处理之前,每一次都会先显示;
示例:以test1文本文件为例,我们查找文本中的每一行末尾的love、like,然后将它们替换成lover和liker:
 
查找文本中的每一行中的love,然后将它替换成lover;
查找文本中所有的love和like,并将它们替换成lover和liker:
查找文本中his、her并将它们替换成His、Her:
sed -e 多点编辑,执行多个脚本,多点编辑,执行多个脚本,可以使用多个-e选
    项,或者使用一个-e选项,后面的脚本用分号隔开;仍以test1为例,查找文本
    中的每一行末尾的love、like,然后将它们替换成lover和liker,同时查找文
    本中his、her并将它们替换成His、Her:
N 追加到下一行,sed命令每次读取一行,当第一行读取后会放到模式空间中不处理
  然后接着读取第二行,读取完后将这两行一块处理,往下以此类推;
 
h 将模式空间的内容以覆盖的方式复制到保留空间;
H 将模式空间的内容以追加的方式复制到保留空间;
g 将保留空间的内容以覆盖的方式复制到模式空间;
G 将保留空间的内容以追加的方式复制到模式空间;
  注:保留空间默认是空的,即相当于空白行;
b 跳转,略过符合模式的行;
b label :label字符的长度不能超过7个;跳转到什么位置,其中的label是固定
  符;
y  /string1/string2/ 把string1替换成string2;
二、总结:
    以上就是sed命令一些用法以及其常用选项、子命令的详细解析,讲解过程几乎完全基于作者记忆和个人理解进行,限于作者的经验和理解能力等,疏漏或错误在所难免,朋友们如对课程中内容的讲解有建议或者意见,欢迎给出指点和建议。
阅读(1830) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~