免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 27285 | 回复: 50
打印 上一主题 下一主题

sed 学习笔记(与大家共勉)  关闭 [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-09-22 09:42 |只看该作者 |倒序浏览
sed 学习笔记(与大家共勉)
声明:这些代码只是为了学习和理解sed命令而为之,并不代表问题的唯一解或最佳解,希望各位拍砖
参考资料:<sed&awk.pdf>等
一. 替换

1.神奇变换(y命令的使用)
  1. sed 'y/ori_letter_list/target_letter_list/' filename
复制代码

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


2.替换每行第一个匹配

  1. sed 's/regexpr/anyword/' filename
  2. sed 's/regexpr/anyword/1' filename
复制代码

举例:
cat filename
1234567890 2345678901
3456789012 4567890123
sed 's/5/五/' filename
1234五67890 2345678901
34五6789012 4567890123


3.替换每行第n(如果有的话)个匹配

  1. sed "s/regexpr/anyword/${n}" filename
  2. cat filename
  3. 111111111111111111
  4. 222222222222222222
  5. 333333333333333333
  6. 444444444444444444
  7. 举例
  8. sed "s/4/ 四 /8" filename
  9. 111111111111111111
  10. 222222222222222222
  11. 333333333333333333
  12. 4444444 四 4444444444
复制代码


4.替换每行所有匹配

  1. cat filename
  2. 1234567890 2345678901
  3. 3456789012 4567890123
复制代码
  1. 举例:
  2. sed 's/3/三/g' filename
  3. 12三4567890 2三45678901
  4. 三456789012 456789012三
复制代码


二.行号处理

1.为文件加行号
  1. sed = filename|sed 'N;s/\n/:/'
  2. cat filename
  3. 111111111111111111
  4. 222222222222222222
  5. 333333333333333333
  6. 444444444444444444
复制代码

举例
  1. sed = filename|sed 'N;s/\n/:/' filename
  2. 1:111111111111111111
  3. 2:222222222222222222
  4. 3:333333333333333333
  5. 4:444444444444444444
复制代码


2.仅为文件中的正文行加行号

  1. sed /./= a|sed '/./N;s/\n/:/'
复制代码

举例
  1. cat filename
  2. 111111111111111111

  3. 222222222222222222
  4. 333333333333333333

  5. 444444444444444444

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

  8. 3:222222222222222222
  9. 4:333333333333333333

  10. 6:444444444444444444
复制代码


三.字串翻转

  1. sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
复制代码

举例
  1. echo 1234567890|sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
  2. 0987654321
复制代码


四.选择性输出

1.打印文档奇数行(隔行输出)

  1. sed 'n;d'
  2. sed 'x;$!N;x'
  3. sed -n 'p;n'

  4. 1
  5. 3
  6. 5
  7. 7
复制代码


2.打印偶数行(隔行输出)

  1. sed -n 'n;p'
  2. sed '1d;n;d;'
  3. 2
  4. 4
  5. 6
  6. 8
复制代码


3.删除连续重复行(大量使用了pattern space 文件太大时要注意)

  1. sed '$!N; /^\(.*\)\n\1$/!P; D'     
  2. #使用 $!N 要当心内存溢出
复制代码

举例
  1. cat file
  2. 111111111111111111
  3. 222222222222222222
  4. 222222222222222222
  5. 333333333333333333
  6. 444444444444444444
  7. 444444444444444444
  8. 444444444444444444
  9. 444444444444444444
  10. 444444444444444444

  11. sed '$!N; /^\(.*\)\n\1$/!P; D' filename
  12. 111111111111111111
  13. 222222222222222222
  14. 333333333333333333
  15. 444444444444444444
复制代码


4.合并上下行并以空格相分隔

  1. sed '$!N;s/\n/ /'
复制代码

举例
  1. cat file
  2. 1234567890
  3. 0987654321
  4. 执行命令后
  5. 1234567890 0987654321
复制代码


5.将以\符号结尾的行与下行合并并以空格分隔(拼接断行)

  1. sed -e :a -e '/\\$/N; s/\\\n/ /; ta'
复制代码

举例
  1. cat filename
  2. 1 111111111111111111\
  3. 2 222222222222222222
  4. 3 333333333333333333\
  5. 4 444444444444444444

  6. sed -e :a -e '/\\$/N; s/\\\n/ /; ta' filename
  7. 1 111111111111111111 2 222222222222222222
  8. 3 333333333333333333 4 444444444444444444
复制代码


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

  1. sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'
复制代码

举例
  1. cat file
  2. 111111111111111111
  3. 222222222222222222
  4. =333333333333333333
  5. 444444444444444444

  6. sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' filename
  7. 111111111111111111
  8. 222222222222222222 333333333333333333
  9. 444444444444444444
复制代码


7.输出匹配行的下一行

  1. sed -n '/regexpr/{n;p;}' filename
复制代码

举例
  1. cat filename
  2. 1 111111111111111111
  3. 2 222222222222222222
  4. 3 333333333333333333
  5. 4 444444444444444444

  6. sed -n '/^3/{n;p;}' filename
  7. 4 444444444444444444
复制代码


8.显示匹配行的行号并输出匹配行的上行、匹配行、下行

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

  6. sed -n -e '/^3/{=;x;1!p;g;$!N;p;D;}' -e h  filename
  7. 3                                       #匹配行的行号
  8. 2 222222222222222222  #上一行
  9. 3 333333333333333333  #匹配行
  10. 4 444444444444444444  #下一行
复制代码


9.删除文档中某标志区域内的关键字匹配行

     删除文档中从being开到end结束的块中包含myword的行
  1. sed '/^begin/,/^end/{/myword/d;}' filename
复制代码
cat filename
myword
begin
myword
Number!
myword
Number!
myword
Number!
myword
Number!

end
myword
Number!
测试
myword
begin
Number!
Number!
Number!
Number!

end
myword
Number!


五.字串解析

1.从字串中解析出两个子串(前2各字符和后9个字符)

  1. echo "WeLoveChinaUnix"|sed -e 'H;s/\(..\).*/\1/;x;s/.*\(.\{9\}\)$/\1/;x;G;s/\n/ /'
  2. We ChinaUnix
复制代码


2.分解日期串

  1. echo 20030922|sed 's/\(....\)\(..\)\(..\)/\1 \2 \3/'|read year month day
  2. echo $year $month $day
  3. 2003 09 22
复制代码
msscisd 该用户已被删除
2 [报告]
发表于 2003-09-22 09:54 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2003-09-22 12:00 |只看该作者

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

好文!

希望斑竹进一步解释一下 label 以及相关的 t 和 b 的用法

论坛徽章:
0
4 [报告]
发表于 2003-09-22 12:53 |只看该作者

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

论坛徽章:
0
5 [报告]
发表于 2003-09-22 13:09 |只看该作者

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

好!!
对我学习SHELL的额外帮助!!
谢谢老版!

论坛徽章:
0
6 [报告]
发表于 2003-09-22 21:29 |只看该作者

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

强,我顶!!

论坛徽章:
0
7 [报告]
发表于 2003-09-22 21:50 |只看该作者

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

up

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2003-09-23 07:45 |只看该作者

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

原帖由 "binary" 发表:
好文!

希望斑竹进一步解释一下 label 以及相关的 t 和 b 的用法
  
先说说b吧:
比如有文件如下:
  1. cat filename
  2. a1234567890
  3. 1234567890
  4. 1234567890a
  5. 1234567890
  6. 123456a7890
复制代码

先要求将其中的"5"替换成" 伍十万 ",但当该行包含字母"a"时,"5"就要替换成" 叁佰万 ".
现看如何通过b来实现:
cat filename.sed
#!/bin/sed  -f
/a/b 5t             #如果当前行包含字母"a"则转到label"5t"处
s/5/ 五十万 /g   #将5替换成" 五十万 "
b                      #未指明跳转位置时,跳到Script的尾部
:5t                    #设置名称为"5t"的label
s/5/ 叁佰万 /g    #提换5为" 叁佰万 "
测试:
sed -f filename.sed filename
1234 五十万 67890
a1234 叁佰万 67890
1234 五十万 67890
1234 叁佰万 67890a
1234 五十万 67890
1234 叁佰万 6a7890

当然,这只是为了说明sedb的用法,不带表此类问题的最佳解决途径.

论坛徽章:
0
9 [报告]
发表于 2003-09-23 10:52 |只看该作者

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

好东东,收留ed

论坛徽章:
0
10 [报告]
发表于 2003-09-23 23:15 |只看该作者

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

太好了,对学shell有很大的帮助.
对n和N命令没太理解,
谁能介绍介绍.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP