Chinaunix首页 | 论坛 | 博客
  • 博客访问: 116609
  • 博文数量: 22
  • 博客积分: 835
  • 博客等级: 准尉
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-25 21:23
文章分类

全部博文(22)

文章存档

2011年(1)

2009年(21)

我的朋友

分类: LINUX

2009-12-11 15:30:14

学习方法探讨:
 有一个事实必须承认,Unix/Linux自由开源所带来的资源共享好处的同时也带来了重复使用,各自为山,非标准化等不好的东西。这给我们学习Unix/Linux带来了非常大的困难,有时会浪费大量时间在一些无意义的学习和重复技术上。比如:shell下存在大量的命令,各种工具也是多如牛毛,并且命令或者工具之间功能存在重复,另外,这些重复部分的语法切各不相同,比如 grep awk sed 都有正则表达式匹配的功能,但是三者的正则表达式语法又有点不相同。并且,每个工具还分 GNU 版和不是 GNU 版,之间的差别也很大,即使都是 GNU 版,那么版本号的细微差别也会带来很多差别。
    我觉得对于GNU/Linux的学习可以采取二八原则的方法,即用20%的时间学习80%的知识,比如说随便一个命令都有一大堆的选项,而在现实80%的应用只会用到20%的选项,另外的80%选项可能永远用不到,所以想快速掌握这个命令,只需要学习这20%常用选项即可。
另外你必须找到一个最快的途径能获取你不知道的剩余的80%。对于sed/awk/正则表达式的学习则更是这样,如果要全面的学习这些内容,你至少需要看《sed & awk》,
《Mastering.Regular.Expressions.3rd.Edition.Aug.2006.chm》书籍,这每一本都四五百页,为了学习这两个工具,你估计都得花几个礼拜的时间,但可能你就是在一两个地方用到一下。算一下性价比确实不高。所以为了节省时间,学习快速参考手册或者别人写
的总结则是一个很好的学习途径。

一、sed总体认识:
 1)sed一个非交互式的可进行批处理文本流编辑器。

 2)处理方式:逐行从参数中指定的输入文件读入一行到模式空间--临时行缓冲区,然后进行模式匹配,如果匹配成功则依次执行后面的命令。同时将结果发送到标准输出或者重定向的文件中去。

 3)sed书写格式:   
 sed [-n][-e] ‘[address[,address]][!]command [arguments]’ inputfiles
 sed [-n] -f scriptfile file(s) #此种情况用的非常少,所以不考虑这种情况。

 说明:
  *第二中方式用的极少,暂时不考虑此种情况。
  *address我们也叫定位文本的方式,一般包括两种:行号和正则表达式,我们一般把他们同意叫成正则表达式。
  *address可以有两个,它们之间用“,”分开,表示从address1到address2之间的所有行。
  *a, i, r, q, and =.命令前面只能有一个address。
  *address后面的"!"表示和address定位到的行相反的所有行。
 

二、sed常用方法:
 sed 选项 ‘正则表达式 命令’ 输入文件
 选项:
     -n   不打印; sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑),p命令可以用来打印编辑行
     -e   下一命令是编辑命令,使用多项编辑时加入此选项
     -i   编辑原文件(此选项慎用,如果使用则原文件就会被修改,无法恢复)。   
     -f   后面指定的脚本文件中所有命令相当于一个命令一样地被执行         

 正则表达式:
     x          #x为一行号,比如1
     x,y        #表示行号范围从x到y,如2,5表示从第2行到第5行
     /pattern/      #查询包含模式的行,如/disk/或/[a-z]/
     /pattern/pattern/   #查询包含两个模式的行,如/disk/disks/
     /pattern/,x    #在给定行号上查询包含模式的行,如/disk/,3
     x,/pattern/    #通过行号和模式查询匹配行,如 3,/disk/
     x,y!       #查询不包含指定行号x和y的行

 常见的几个命令:
  s    #使用pattern2替换pattern1,有点特别是"s"写在前面sed  's/pattern1/pattern2/g' testfile
  p    #打印匹配行             sed  -n '/pattern/p' testfile                      
  d    #删除匹配行                  sed '/pattern/d' testfile                    
  i    #在匹配行前插入指定文本         sed '/pattern/i\--toinsert--' testfile
  a    #在匹配行后附加指定文本信息        sed '/^pattern/a\--toappend--' testfile
    
 其他命令 
  g       #在行内进行全局替换,常和s配合使用 sed  's/pattern1/pattern2/g'  testfile
  c       #将当前匹配行修改成指定文本行   sed '/ming/c\-student-' datafile
  r       #将一个文件的内容追家到匹配行的后面  sed '/pattern/r file' datafile
  w       #将当前匹配的行写入到一个新文件中sed -n ‘/pattern/w newfile’ datafile
  q       #处理完前面的模式匹配完成后退出     sed ‘5q’ datafile
  =       #显示文件行号                     sed -n '$=' datafile === wc -l
  y       #按照一对一的方式从左到有进行转换    sed '1,3y/abc/ABC/' datafile


其他参考资料:
GNU sed:
《Quick Reference for sed》

阅读(1121) | 评论(0) | 转发(0) |
0

上一篇:Shell编程学习总结

下一篇:sed&awk学习总结2

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