Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300138
  • 博文数量: 47
  • 博客积分: 1667
  • 博客等级: 上尉
  • 技术积分: 686
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 16:20
文章分类

全部博文(47)

文章存档

2013年(20)

2012年(20)

2011年(7)

分类: LINUX

2012-07-13 16:16:47

sed 
sed 维护了一个模式空间,另外维护了一个保持空间。
通常情况下,sed 将要处理的文件的一行读入模式空间,然后在模式空间里用脚本对其进行处理,处理完成之后打印模式空间的内容。并情况模式空间。然后再读入一行………………按此循环。
当在多行模式下,会使用到保持空间,用于与模式空间交互,并改变正常的流顺序,来达到复杂的处理。


sed 命令格式为 
   [address] command
   address 可以用正则匹配,也可以直接制定行号




d 表示删除模式空间中所有的内容
g 表示全局
s 表示替换
p 打印模式空间中的内容
= 打印行号
r [file] 将file内容追加进模式空间
W [file] 将模式空间中的内容写进file
! 正则,表示取反
& 用正则匹配的内容进行替换
q 退出




追加       #在模式空间中追加内容
[line-address]a\    
text                  




插入         #在模式空间之间插入内容
[line-address]i\    
text  


更改         #在一个范围行内用文本替换
[address]c\
text

转换           #在匹配内,用xyz转换abc,注意是单个字符
[address]y/abc/xyz   


n 输出模式空间的内容,然后读入下一行进模式空间,而不用返回脚本的顶端

N 读取下一行,并将它追加到模式空间的现有内容之后建立多行模式空间,模式空间最初的内容和新的输入行之间用
  换行符间隔。
  N和n命令不同的是,n输出模式空间的内容,然后读取新的输入行,n不创建多行模式空间
  
D 删除模式空间中的第一行。并且返回到脚本的顶端,将这些指令应用于模式空间中剩余的内容。d 删除模式空间中所有的
  内容,然后读取新的输入行,在脚本的顶端重新使用编辑方法。




P 打印模式空间中的第一行。


h 将模式空间的内容覆盖到保持空间。
H 将模式空间的内容追加到保持空间。


g 将保持空间的内容覆盖到模式空间。
G 将保持空间的内容追加到模式空间。




x 交换保持空间和模式空间的内容。




标签

b label ,无条件跳转到标签label,如果label没有指定,跳转到命令的结尾。
t label , 如果最后一次输入的最后一个s///命令执行成功,跳转到标签label,如果没有指定label,跳转到命令的结尾。

# cat test 
a
a
a
a
a
a
a
a
a

将第2个a修改成b,并删除最后一个空行

# sed '0,/a/b;s/a/b/;ta;:b;/^$/d;:a;n;bb' test 
a
b
a
a
a
a
a
a
a

关于b标签和t标签的分别,看下面的例子更明白:
[root@localhost ~]# cat test 
114.113.144.2:
19ms
19ms
19ms
36ms
22ms
19ms
18ms
218.61.204.73:
0ms
0ms
0ms
0ms
0ms
0ms
0ms
[root@localhost ~]# sed  ':a;N;/ms$/s/\n/\t/;ta;P;D;' test 
114.113.144.2: 19ms 19ms 19ms 36ms 22ms 19ms 18ms
218.61.204.73: 0ms 0ms 0ms 0ms 0ms 0ms 0ms
[root@localhost ~]# sed  ':a;N;/ms$/s/\n/\t/;ba;P;D;' test 
114.113.144.2: 19ms 19ms 19ms 36ms 22ms 19ms 18ms 218.61.204.73: 0ms 0ms 0ms 0ms 0ms 0ms
0ms

当ms不匹配的时候,t标签没有,然后直接用P输出第一行,然后D删除这一行,然后循环
当ms不匹配的时候,b标签仍然执行,又跳到a
























阅读(1484) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~