免费注册 查看新帖 |

Chinaunix

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

用实例说明sed的用法-1 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-02 09:11 |只看该作者 |倒序浏览
本帖最后由 pianist_cu 于 2012-03-02 09:19 编辑

   SED实例
作者  :pianist
Email:xiaopei0206@gmail.com
日期  :2009-07-28
转载请注明作者。

    sed 编辑器是 Linux 系统管理员的工具包中最有用的资产之一,因此,有必要彻底地了解其应用。不知道什么是sed的同学,请先搞明白sed的基本作用再来做这个题集。

    根据学习曲线,看一遍,只能记住 10%,实际操作后能记住80%,所以,如果你想熟练掌握sed,最好打开一个窗口,跟着我一起做下面的练习。
“We Learn . . .
10% of what we read
20% of what we hear
30% of what we see
50% of what we see and hear
70% of what we discuss
80% of what we experience
95% of what we teach others.”— William Glasser

      
ubuntu@ubuntu:~$ cat > dat              # 往dat文件里输入以下数据
1 dat                                                    # 以后的大部分例子,都将使用dat文件作为处理对象
2 Desktop                           
3 dir1
4 dir2
5 Documents
6 Music
7 Pictures
8 Public
9 Templates
10 Videos
Ctrl+D 结束输入

sed指令由两部分组成,address和function,也就是说,对符合address的行执行function。
下面介绍几种address的形式:
[ubuntu@bourne ~]$ sed '6p' dat         # p(print), 打印第6行,
1 dat                                                     #6是address,p是function,下同
2 Desktop
3 dir1
4 dir2
5 Documents
6 Music                                                 #sed默认是自动输出的
6 Music                                                 #这一行是由命令p输出的
7 Pictures
8 Public
9 Templates
10 Videos
ubuntu@ubuntu:~$ sed -n '6p' dat       #n(quiet), 关闭自动输出; 打印第6行
6 Music                                                 #通常,命令n和p结合使用,否则没有任何输出

ubuntu@ubuntu:~$ sed -n '$p' dat       #$,表示最后一行,加上p,表示打印最后一行
10 Videos
ubuntu@ubuntu:~$ sed -n '/dir/p' dat  # 打印包含“dir”的行
3 dir1
4 dir2
ubuntu@ubuntu:~$ sed -n '1,4p' dat    # 打印1到4行
1 dat
2 Desktop
3 dir1
4 dir2
ubuntu@ubuntu:~$ sed -n '2, /Doc/p' dat             # 打印第2行,到包含”Doc”之间的行
2 Desktop
3 dir1
4 dir2
5 Documents
ubuntu@ubuntu:~$ sed -n '/Doc/, /Pic/p' dat       # 打印包含”Doc”,到包含”Pic”之间的行
5 Documents
6 Music
7 Pictures
ubuntu@ubuntu:~$ sed -n '/Doc/, 9p' dat            # 打印包含”Doc”,到第9行之间的行
5 Documents
6 Music
7 Pictures
8 Public
9 Templates
ubuntu@ubuntu:~$ sed -n '2,+5p' dat                  # 打印第2行,及其后面的5行
2 Desktop
3 dir1
4 dir2
5 Documents
6 Music
7 Pictures
ubuntu@ubuntu:~$ sed -n '/Doc/,+3p' dat           # 打印包含”Doc”的行,及其后面的三行
5 Documents
6 Music
7 Pictures
8 Public

ubuntu@ubuntu:~$ sed -n '1~2p' dat                   # 打印从第1行开始,行号依次递增2的行
1 dat                                                                     # 即1,3,5,7,9行
3 dir1
5 Documents
7 Pictures
9 Templates
ubuntu@ubuntu:~$ sed -n '1~3p' dat                   # 打印从第1行开始,行号依次递增3的行
1 dat
4 dir2
7 Pictures
10 Videos
ubuntu@ubuntu:~$ sed -n '2~3p' dat                   #打印从第2行开始,行号依次递增3的行
2 Desktop
5 Documents
8 Public

ubuntu@ubuntu:~$ sed '1,3d' dat                         #删除1-3行
4 dir2
5 Documents
6 Music
7 Pictures
8 Public
9 Templates
10 Videos

ubuntu@ubuntu:~$ sed -e '1,3d' dat           #e(expression),在命令行上直接使用sed命令
4 dir2                                                           #当只有一个表达式(expression)时,命令e可以省略
5 Documents                                               #我们之前的例子都没有使用e
6 Music
7 Pictures
8 Public
9 Templates
10 Videos

ubuntu@ubuntu:~$ sed -n -e '1p' -e '/Doc/p' dat   #有多个表达式时,e不可省略,
1 dat                                                                       #每个表达式前都要加-e
5 Documents

[ubuntu@bourne ~]$ echo 1p > cmd                      #将上面两个表达式输入到一个文件cmd中
[ubuntu@bourne ~]$ echo "/Doc/p" >> cmd
[ubuntu@bourne ~]$ cat cmd
1p
/Doc/p
[ubuntu@bourne ~]$ sed -n -f cmd dat                  #f (script-file),将命令组成的脚本放在f参数后执行
1 dat                                                                       #在需要较多较长命令时很有效,便于编辑命令
5 Documents

ubuntu@ubuntu:~$ cat dat
1 dat
2 Desktop
3 dir1
4 dir2
5 Documents
6 Music
7 Pictures
8 Public
9 Templates
10 Videos

ubuntu@ubuntu:~$ cp dat dat.bk
ubuntu@ubuntu:~$ sed -i '1,3d' dat                        #上面所有例子的输出都不会对源文件dat造成改变,
ubuntu@ubuntu:~$ cat dat                                    #加入i(in-place)参数后,将直接对原文件进行编辑,
4 dir2                                                                      #因此编辑之前,最好备份原文件
5 Documents
6 Music
7 Pictures
8 Public
9 Templates
10 Videos
ubuntu@ubuntu:~$ cp dat.bk dat                           #恢复操作数据,我们继续

ubuntu@ubuntu:~$ sed -n '/dir1/=' dat                  #=打印dir1的行号,只有行号,不包含这一行的内容
3
ubuntu@ubuntu:~$ sed -n '/dir1/=; /dir1/p' dat      #打印dir1的行号,和这一行的内容
3
3 dir1
  
ubuntu@ubuntu:~$ sed '/Document/a\oooooooooooooo' dat     #a(append text),
1 dat                                                                                             #在包含Document的行后添加字符串                                                                  
2 Desktop                                                                                     #有些时候可以直接用”a”,
3 dir1                                                                                            #而不用包含后面的'\'
4 dir2
5 Documents
oooooooooooooo
6 Music
7 Pictures
8 Public
9 Templates
10 Videos

ubuntu@ubuntu:~$ sed '/Document/i\oooooooooooooo' dat     #i(insert text), 在包含
1 dat                                                                                            #Document的行前插入字符串
2 Desktop
3 dir1
4 dir2
oooooooooooooo
5 Documents
6 Music
7 Pictures
8 Public
9 Templates
10 Videos

ubuntu@ubuntu:~$ sed '/Document/c\oooooooooooooo' dat  #c,用字符串替换包含
1 dat                                                                                         #“Document”的行
2 Desktop
3 dir1
4 dir2
oooooooooooooo
6 Music
7 Pictures
8 Public
9 Templates
10 Videos

进行下面的操作之前,先了解一下sed基本的工作原理。
Sed以行为单位对文件进行处理,sed从待处理的文件中读取一行数据存入模式空间(pattern space,是一段内存),对它执行-e或-f参数中赋予的命令(如果这一行数据符合address的描述,如包含dir,就执行function),输出模式空间的内容,然后清空模式空间;读取下一行数据存入模式空间,再执行-e或-f参数中的命令....直到文件结束。

ubuntu@ubuntu:~$ sed '/Pictures/q' dat             #q(quit), 执行到包含Pictures的行时,
1 dat                                                                    #打印当前模式空间的内容,再退出sed
2 Desktop                                                            #在这个例子中,“当前模式空间”中存储的就是
3 dir1                                                                   #“7 Pictures”
4 dir2
5 Documents
6 Music
7 Pictures
ubuntu@ubuntu:~$ sed '/Pictures/Q' dat             #Q(QUIT),执行到包含Pictures的行时,
1 dat                                                                    #不打印当前模式空间的内容,退出sed
2 Desktop
3 dir1
4 dir2
5 Documents
6 Music

ubuntu@ubuntu:~$ cat a
@@@@@@@@ hello
@@@@@@@@ world
ubuntu@ubuntu:~$ sed '/Public/r a' dat              #r(read file),执行到包含Public的行时,
1 dat                                                                    #读入文件a的内容
2 Desktop
3 dir1
4 dir2
5 Documents
6 Music
7 Pictures
8 Public
@@@@@@@@ hello
@@@@@@@@ world
9 Templates
10 Videos

论坛徽章:
0
2 [报告]
发表于 2012-03-02 14:46 |只看该作者
难道要沉?

论坛徽章:
0
3 [报告]
发表于 2012-03-03 00:17 |只看该作者
顶一下楼主,有没有AWK方面的操作实例?

论坛徽章:
0
4 [报告]
发表于 2012-03-03 15:13 |只看该作者
这些东西文档很多……

论坛徽章:
0
5 [报告]
发表于 2014-08-05 10:48 |只看该作者
谢谢楼主分享,基础加实例很适合我这种初学者
还是以楼主的dat文档为例,有个疑问想请教下:
  1. xian@QA:~$ sed -n '0,/Public/{s/Public/private/p}' dat
  2. 8 private
复制代码
1.0代表什么意思呢?
  1. xian@QA:~$ sed -n '1,/D/{s/D/private/p}' dat
  2. 2 privateesktop
复制代码
2.这个例子中的1,/D/是指从第一行到第一个匹配到字符D吗?

论坛徽章:
0
6 [报告]
发表于 2014-08-05 18:02 |只看该作者
谢LZ,新手受教了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP