- 论坛徽章:
- 0
|
本帖最后由 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 |
|