转载自:http://www.furion.info/283.html
最近工作中严重感觉不顺手,加上要给同事写个简单的小脚本,憋了半天才倒腾出来一个玩意,而且暴丑,同时也被组内大神鄙视了,说我写的什么呀,太尼玛丑了。于是我感觉有必须好好的学学sed了。
废话不多说,经过我闭关修炼N久,终于有了点成果。无图无真相,有图为证:
Contents [hide]
1.基本执行流程:
Read、Execute、Print、Repeat,懂这个就ok了。input文件的每一行都要执行所有的sed 命令,之后才会读取下一行执行。
2.地址匹配:
sed由ed发展而来(ed是vim等的底层),ed默认必须指定地址范围,而sed则相反,sed默认的地址访问就是整个文件。所以当需要指定某些范围执行特定命令时,必须限定相应的范围。
具体的地址匹配方法有三种:
a)具体的行号
b)正则表达式
c)行号加正则
细节不再多说,图中的地址匹配部分也都有说明。
3.正则:
sed支持普通正则以及扩展正则,建议使用选项-r从而使sed支持扩展正则。普通正则比较麻烦,分组必须使用\(.*\)的形式,而扩展正则可以直接使用(.*)。
具体的正则表达式也不多说了,常用的有:
a)^ 行开始瞄点
b)$ 行结束瞄点
c)\b 单词边界
d)[a-z] 小写字母
等等,就不多说了。
4.分组:
分组是用来保存特定部分的内容的,如(ab)(cd),则第一个分组为(ab),后续就可以使用\1等再次使用该分组,从而实现\2\1这种内容的颠倒。当然这只是一个最简单的例子,具体的同样建议采用-r选择,从而使用扩展正则的( )捕获分组。
5.flags:
flags为替换命令(s)的一系列的标志位,常用的有:
a)g:替换全部
b)i :不区分大小写的替换
c)p: 打印
这里有个比较有趣的gnu flags,即只在gnu版本sed上支持的标志位。详见图上面的的gnu flags 部分。
gnu flags中增加了几个很有趣的标志,用来实现大小写之间的转换。个人以为这是sed中大小写转换最方法的方法了。通常sed中没有太好的方法实现大小写的转换,常用的做法有:
sed ‘y/abc/ABC/’ inputfile
缺点为需要写很长很长的替换列表,而采用gnu flags就很爽了,实现如下:
sed ‘s/(.*)/\L&/’ inputfile
巧妙的地方就在于\L,\L将后续的内容统统转换为大写,类似的\U会转换为小写。而\l与\L效果一样,但\l的作用范围仅仅为后续的一个字符,\L则内后续的全部内容。
有同学担心\L、\U的方法过大,无法控制,表要担心,\E可以阻断\L等的作用范围,从而控制\L等的大小写替换。
6.执行方法:
sed命令有灵活的执行方法:
a)单个命令: sed [optinon] { sed-commands } {input-file}
b)多个命令-e: sed [option] -e {sed-com-1} -e {sed-com-2} {input-file }
采用-e 选项告诉sed将内容解释为命令
c)多个命令{}:
sed [options] ‘
{ sed-command1 sed-command2
}’ input-file
采用{}包含多个命令
d)sed命令文件-f: sed [option] -f {sed-coman-file } {input-file }
采用-f选项让sed执行文件中的命令,可以提高脚本的复用。
7.sed选项:
sed有多个选项用以实现不同的目的,常用的有:
a) –i : 告诉sed直接修改原文件,也可以使用-ibak的形式,告知sed自动生成加bak后缀的备份文件
b)-f: 指定sed命令文件
c) –r: 使用拓展正则
d) –n: 屏蔽默认输出
8.总结:
个人以为sed中核心的就是以上7部分了,其他的都是具体的应用了,如删除d、打印p、添加行a(或者i)、读写文件等。当然了还有我们最经常使用的替换(s)命令。
但这些具体命令的应用都会涉及到前面说的地址匹配、正则、flags等内容,所以前面的基础弄明白了,具体的实现就很简单了,无非是各种组合而已。
总之,通过这段的“闭关”还是学习到了很多,大大的增加了对sed这一利器的熟悉,基本的操作、应用等已经阻挡不了我了。不过遗憾的是,sed高级部分的模式空间还没有很好的理解,所以这里也就不献丑多说这部分了,坐等大神讲解模式空间这部分了。