Chinaunix首页 | 论坛 | 博客
  • 博客访问: 595113
  • 博文数量: 248
  • 博客积分: 52
  • 博客等级: 民兵
  • 技术积分: 1028
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-23 12:05
文章分类

全部博文(248)

文章存档

2016年(7)

2013年(241)

分类: LINUX

2013-04-09 04:56:38

原文地址:sed 最佳实践 [转] 作者:fan3838

    在实现procmail过滤邮件的时候又温习了一下sed的用法,从网上转一篇文章:

1.练习文件

$ vi datafile
northwest NW Charles Main 3.0 .98 3 34
northern WE Sharon Cray 5.3 .97 5 23
southnorth SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Particia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .7 4 20
northeast NE am Main JR. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
wangdongsheng ST Neu Soft 8.8 .77 6 5

2. sed '/north/p' datafile
默认情况下sed会打出全部的,如果在某一行匹配到模式north ,sed会多打一遍此行.

3. sed -n 'north/p' datafile
-n 与p命令配合使用,sed 取消了sed的缺省打印动作,如果不指定n这个选项,sed就会从复打印north选项,如果指定了n就只打印模式north的那几行.

4. sed '3d' datafile
d命令就是删除第3行内容。

5.sed'3,$d' datafile
删除第3行到最后一行的内容。

6. sed '$d' datafile
删除最后一行.

7. sed '/north/d' datafile
删除包含所有行的north;其他的打印出来

8.sed 's/west/north/g'
把所有的west替换成north

9.sed -n 's/^west/north/p' datafile
搜索行首带west的行,并将替换为north,并打印出来

10.sed 's/[0-9][0-9]$/&.5/' datafile
与符号(&)在替换穿中时,代表查找串中匹配内容。这个例子中以两位数字结尾的行后面都被加上.5如果要在替换串中表示“与”号字面的含义,就要对起进行转义,记为:\&

11. sed -n 's/Hemenway/Jones/gp' datafile
文件中出现所有Hemenway都被替换为Jones,唯一发生变化的行被打印.选项-n与p的组合取消了缺省的输出,标志g含义在行内进行全局替换。

12. sed -n 's/\(Mar\)got/\lianne/p' datafile
扩在括号里的模式Mar作为标签1被保存与特殊寄存器中,替换串通、1引用它,Margot被替换为Marianne.

13. sed 's#3#88#g' datafile
紧跟在S命令的字符是查找和替换之间的分隔符。分隔符缺省的正斜杠,但可以改变(只在使用s命令时).无论什么字符,只要紧跟着s命令就成新的串分隔符,这个方法在查找包含正斜杠的模式时很管用,例如查找路径名和生日.

14. sed -n '/west/,/east/p' datafile
打印在west和east之间的所有行,如果west出现在east之后的某一行,则打印的范围从west所在行开始,到下一个出现east的行或文件末尾。

15. sed -n '5,/^northeast/p' datafile
打印前5行到第一个以northeast开头的行之间的所有行.

16 '/west/,/east/s/$/***WANGDONGSHENG***/' datafile
修改模式east和west之间的所有行,将各行的行尾($)替换为字符串***WANGDONGSHENG***换行符号被移动到这个新的字符串后面,箭头标出了范围.

17. sed -e '1,3d' -e 's/Hemenway/Jones' datafile
-e的作用是先删除1到3行,然后把Hemenway替换Jones,因为这是逐行编辑的(即两个命令都在模式空间上执行),所以编辑的顺序会影响结果.例如如果两条命令都是执行替换,则前一行替换会影响后一行.

18.sed -n '/north/w newfile' datafile
w命令是把指定写入文件。文件datafile中所有包含模式north的行都写到文件newfile中

19.sed '/^north /a\\---->the north sales district has moved<---' datafile
a为追加命令,字符串the north sales district has moved被加在以north开头,north后跟一空格的各行之后,用于追加文本必须出现在追加命令下一行上.

20.sed '/eastern/i\\NEW REGLAND REGION\\---------------------------' datafile
i命令是插入命令。如果某一行匹配到模式eastern,i命令就在该行上放插入命令中反斜杠后的文本,除了最后一行,用于插入文本中每一行都必须以反斜杠结尾

21.sed '/eastern/{ n; s/AM/Archie/; }' datafile
如果在某一行匹配到模式eastern,n命令就是指sed用下一个输入行(即包括AM Main Jr 的那行)替换模式空间中的当前行,用Archie替换(s)其中的AM,然后打印

22. sed'1,3y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ' datafile
y命令把第一到第3行所有小写字母换成大写字母。正则表达式对y不起作用.

23 sed '5q' datafile
打印第5行之后,q命令让sed程序退出

24 'Lewis/{ s/Lewis/Joseph/;q; }' datafile
在某行匹配模式到Lewis时,先用Joseph替换(s)Lewis然后q命令退出

25 sed -e '/northeast/h' -e '$G' datafile
如果在某一行找到模式WE,h命令就将该行从模式缓冲区拷贝到一个暂存的缓冲区保存在暂存缓冲区的行可以在以后被重新取出(使用命令G或g),这个例子中,当模式WE被找到时将模式缓冲区的那份拷贝删除,

26.sed -e '/WE/{h; d; }' -e '/CT/{G; }' datafile
sed 处理文件时,会把文件每一行都保存在一个临时的缓冲区中,这个缓冲区会被称为模式空间。sed处理每一行后,都会将其打印在屏幕上,除非该行被删除会被取消。之后模式空间清空,下一输入行等待处理。本例子中,被包含的模式northeast的行被找到之后,就被保存在模式空间里h命令把复制并保存到另一个缓冲区,这个特殊的缓冲区是暂存的缓冲区(holding buffer)在第二条sed命令中,sed读到最后一行($)时,G命令指示它从暂存缓冲区读出一行,将其放回模式缓冲区,追加在模式空间内当前行(本例中是最后一行)的后面.

--END--



转自:http://hi.baidu.com/edeed/blog/item/0bf3d0a2937912afcbefd0b0.html
阅读(460) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~