您的位置:首页 > 文档 > Shell >
 文章分类 

sed 学习笔记(与大家共勉)


创建:2005-10-26 00:49:44
作者:Unlinux
来自: http://www.Unlinux.com

[b:4c6c2a6554]sed 学习笔记(与大家共勉)[/b:4c6c2a6554]
[b:4c6c2a6554]声明:[/b:4c6c2a6554]这些代码只是为了学习和理解sed命令而为之,并不代表问题的唯一解或最佳解,希望各位[b:4c6c2a6554]拍砖[/b:4c6c2a6554]
参考资料:<sed&awk.pdf>等
[b:4c6c2a6554][color=red:4c6c2a6554]一. 替换[/color:4c6c2a6554][/b:4c6c2a6554]

[b:4c6c2a6554]1.神奇变换([color=red:4c6c2a6554]y[/color:4c6c2a6554]命令的使用)[/b:4c6c2a6554][code:1:4c6c2a6554] sed 'y/ori_letter_list/target_letter_list/' filename[/code:1:4c6c2a6554]

[code:1:4c6c2a6554]cat filename
1234567890
2345678901
3456789012
4567890123[/code:1:4c6c2a6554]测试
将文件中[color=red:4c6c2a6554]1[/color:4c6c2a6554]换成[color=indigo:4c6c2a6554]A[/color:4c6c2a6554]
将文件中[color=red:4c6c2a6554]2[/color:4c6c2a6554]换成[color=indigo:4c6c2a6554]B[/color:4c6c2a6554]
...
将文件中[color=red:4c6c2a6554]0[/color:4c6c2a6554]换成[color=indigo:4c6c2a6554]J[/color:4c6c2a6554]
[code:1:4c6c2a6554]sed 'y/1234567890/ABCDEFGHIJ/' filename
ABCDEFGHIJ
BCDEFGHIJA
CDEFGHIJAB
DEFGHIJABC[/code:1:4c6c2a6554]注意变换关系是按两个list的位置对应变换,y是一个管局命令,拒绝使用后缀flag/[color=red:4c6c2a6554]g[/color:4c6c2a6554]
list1:1234567890
list2:ABCDEFGHIJ
下面再作一个与前例相反的变换
[code:1:4c6c2a6554]sed 'y/0987654321/ABCDEFGHIJ/' filename
JIHGFEDCBA
IHGFEDCBAJ
HGFEDCBAJI
GFEDCBAJIH[/code:1:4c6c2a6554]

[b:4c6c2a6554]2.替换每行第一个匹配[/b:4c6c2a6554]

[code:1:4c6c2a6554]sed 's/regexpr/anyword/' filename
sed 's/regexpr/anyword/1' filename[/code:1:4c6c2a6554]
举例:
[quote:4c6c2a6554]cat filename
1234567890 2345678901
3456789012 4567890123
sed 's/5/五/' filename
1234五67890 234[color=green:4c6c2a6554]5[/color:4c6c2a6554]678901
34五6789012 4[color=green:4c6c2a6554]5[/color:4c6c2a6554]67890123[/quote:4c6c2a6554]

[b:4c6c2a6554]3.替换每行第n(如果有的话)个匹配[/b:4c6c2a6554]

[code:1:4c6c2a6554]sed "s/regexpr/anyword/${n}" filename
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444
举例
sed "s/4/ 四 /8" filename
111111111111111111
222222222222222222
333333333333333333
4444444 四 4444444444[/code:1:4c6c2a6554]

[b:4c6c2a6554]4.替换每行所有匹配[/b:4c6c2a6554]

[code:1:4c6c2a6554]cat filename
1234567890 2345678901
3456789012 4567890123[/code:1:4c6c2a6554]
[code:1:4c6c2a6554]举例:
sed 's/3/三/g' filename
12三4567890 2三45678901
三456789012 456789012三[/code:1:4c6c2a6554]

[b:4c6c2a6554][color=red:4c6c2a6554]二.行号处理[/color:4c6c2a6554][/b:4c6c2a6554]

[b:4c6c2a6554][color=blue:4c6c2a6554]1.[/color:4c6c2a6554]为文件加行号[/b:4c6c2a6554]
[code:1:4c6c2a6554]sed = filename|sed 'N;s/n/:/'
cat filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444[/code:1:4c6c2a6554]
举例
[code:1:4c6c2a6554]sed = filename|sed 'N;s/n/:/' filename
1:111111111111111111
2:222222222222222222
3:333333333333333333
4:444444444444444444[/code:1:4c6c2a6554]

[b:4c6c2a6554]2.仅为文件中的正文行加行号[/b:4c6c2a6554]

[code:1:4c6c2a6554]sed /./= a|sed '/./N;s/n/:/'[/code:1:4c6c2a6554]
举例
[code:1:4c6c2a6554]cat filename
111111111111111111

222222222222222222
333333333333333333

444444444444444444

sed /./= a|sed '/./N;s/n/:/' filename
1:111111111111111111

3:222222222222222222
4:333333333333333333

6:444444444444444444[/code:1:4c6c2a6554]

[b:4c6c2a6554][color=red:4c6c2a6554]三.字串翻转[/color:4c6c2a6554][/b:4c6c2a6554]

[code:1:4c6c2a6554]sed '/n/!G;s/(.)(.*n)/&21/;s/.//'[/code:1:4c6c2a6554]
举例
[code:1:4c6c2a6554]echo 1234567890|sed '/n/!G;s/(.)(.*n)/&21/;s/.//'
0987654321[/code:1:4c6c2a6554]

[b:4c6c2a6554][color=red:4c6c2a6554]四.选择性输出[/color:4c6c2a6554][/b:4c6c2a6554]

[b:4c6c2a6554]1.打印文档奇数行(隔行输出)[/b:4c6c2a6554]

[code:1:4c6c2a6554]sed 'n;d'
sed 'x;$!N;x'
sed -n 'p;n'

1
3
5
7[/code:1:4c6c2a6554]

[b:4c6c2a6554]2.打印偶数行(隔行输出)[/b:4c6c2a6554]

[code:1:4c6c2a6554]sed -n 'n;p'
sed '1d;n;d;'
2
4
6
8[/code:1:4c6c2a6554]

[b:4c6c2a6554]3.删除连续重复行(大量使用了pattern space 文件太大时要注意)[/b:4c6c2a6554]

[code:1:4c6c2a6554]sed '$!N; /^(.*)n1$/!P; D'
#使用 $!N 要当心内存溢出[/code:1:4c6c2a6554]
举例
[code:1:4c6c2a6554]cat file
111111111111111111
222222222222222222
222222222222222222
333333333333333333
444444444444444444
444444444444444444
444444444444444444
444444444444444444
444444444444444444

sed '$!N; /^(.*)n1$/!P; D' filename
111111111111111111
222222222222222222
333333333333333333
444444444444444444[/code:1:4c6c2a6554]

[b:4c6c2a6554]4.合并上下行并以空格相分隔[/b:4c6c2a6554]

[code:1:4c6c2a6554]sed '$!N;s/n/ /'[/code:1:4c6c2a6554]
举例
[code:1:4c6c2a6554]cat file
1234567890
0987654321
执行命令后
1234567890 0987654321[/code:1:4c6c2a6554]

[b:4c6c2a6554]5.将以符号结尾的行与下行合并并以空格分隔(拼接断行)[/b:4c6c2a6554]

[code:1:4c6c2a6554]sed -e :a -e '/$/N; s/n/ /; ta'[/code:1:4c6c2a6554]
举例
[code:1:4c6c2a6554]cat filename
1 111111111111111111
2 222222222222222222
3 333333333333333333
4 444444444444444444

sed -e :a -e '/$/N; s/n/ /; ta' filename
1 111111111111111111 2 222222222222222222
3 333333333333333333 4 444444444444444444[/code:1:4c6c2a6554]

[b:4c6c2a6554]6.按关键字拼接行[/b:4c6c2a6554]
如果某行以=开始,则合并到上一行并替代=为空格

[code:1:4c6c2a6554]sed -e :a -e '$!N;s/n=/ /;ta' -e 'P;D'[/code:1:4c6c2a6554]
举例
[code:1:4c6c2a6554]cat file
111111111111111111
222222222222222222
=333333333333333333
444444444444444444

sed -e :a -e '$!N;s/n=/ /;ta' -e 'P;D' filename
111111111111111111
222222222222222222 333333333333333333
444444444444444444[/code:1:4c6c2a6554]

[b:4c6c2a6554]7.输出匹配行的下一行[/b:4c6c2a6554]

[code:1:4c6c2a6554]sed -n '/regexpr/{n;p;}' filename[/code:1:4c6c2a6554]
举例
[code:1:4c6c2a6554]cat filename
1 111111111111111111
2 222222222222222222
3 333333333333333333
4 444444444444444444

sed -n '/^3/{n;p;}' filename
4 444444444444444444[/code:1:4c6c2a6554]

[b:4c6c2a6554]8.显示匹配行的行号并输出匹配行的上行、匹配行、下行[/b:4c6c2a6554]

sed -n -e '/regexpr/{=;x;1!p;g;$!N;p;D;}' -e h
举例
[code:1:4c6c2a6554]cat filename
1 111111111111111111
2 222222222222222222
3 333333333333333333
4 444444444444444444

sed -n -e '/^3/{=;x;1!p;g;$!N;p;D;}' -e h filename
3 #匹配行的行号
2 222222222222222222 #上一行
3 333333333333333333 #匹配行
4 444444444444444444 #下一行[/code:1:4c6c2a6554]

[b:4c6c2a6554]9.删除文档中某标志区域内的关键字匹配行[/b:4c6c2a6554]

删除文档中从being开到end结束的块中包含myword的行
[code:1:4c6c2a6554]sed '/^begin/,/^end/{/myword/d;}' filename[/code:1:4c6c2a6554]
[quote:4c6c2a6554]cat filename
myword
begin
[color=blue:4c6c2a6554]myword
Number!
myword
Number!
myword
Number!
myword
Number![/color:4c6c2a6554]
end
myword
Number![/quote:4c6c2a6554]测试
[quote:4c6c2a6554]myword
begin
[color=darkblue:4c6c2a6554]Number!
Number!
Number!
Number![/color:4c6c2a6554]
end
myword
Number![/quote:4c6c2a6554]

[b:4c6c2a6554][color=red:4c6c2a6554]五.字串解析[/color:4c6c2a6554][/b:4c6c2a6554]

[b:4c6c2a6554]1.从字串中解析出两个子串(前2各字符和后9个字符)[/b:4c6c2a6554]

[code:1:4c6c2a6554]echo "WeLoveChinaUnix"|sed -e 'H;s/(..).*/1/;x;s/.*(.{9})$/1/;x;G;s/n/ /'
We ChinaUnix[/code:1:4c6c2a6554]

[b:4c6c2a6554]2.分解日期串[/b:4c6c2a6554]

[code:1:4c6c2a6554]echo 20030922|sed 's/(....)(..)(..)/1 2 3/'|read year month day
echo $year $month $day
2003 09 22[/code:1:4c6c2a6554]

转载自:http://www.unlinux.com/doc/shell/20051026/189.html

评论】 【加入收藏夹】 【 】 【打印】 【关闭
 *  请尊重我们的劳动,转载请注明出自UnLinux.Com及作者名 * 

※ 相关链接
 ·SED 手册 - 1. Introduction  (2005-10-26 00:49:44)
 ·SED 手册 - 2. 使用 sed  (2005-10-26 00:49:44)
 ·SED 手册 - 3.例  (2005-10-26 00:49:44)
 ·SED 手册 - 4.介绍函数参数  (2005-10-26 00:49:44)
 ·SED 手册 - 5.常用的 regular expression  (2005-10-26 00:49:44)
 ·SED 手册 - 6.解  (2005-10-26 00:49:44)
 ·sed 实例  (2005-10-26 00:49:44)
 ·sed 实例,第 3 部分  (2005-10-26 00:49:44)
 ·grep/awk/sed的多条件查询  (2005-10-26 00:49:43)
 ·HANDY ONE-LINERS FOR SED  (2005-10-26 00:49:43)

Copyright © 2005 UnLinux.Com All Rights Reserved