·ChinaUnix首页 ·论坛 ·博客 
Linux首页 | Linux新闻 | Linux论坛 | Linux文档 | Linux下载 | Linux博客 | Linux搜索 | 开源项目孵化平台 | 《开源时代》
新手入门 | 安装启动 | 管理员指南 | 开发手册 | 桌面应用 | 程序开发 | 数据库 | 网络技术| CentOS | Fedora | MySQL | Apache | Ubuntu | Gentoo| OSCON08
  Linux时代 >> 技术文档 >> 程序开发
 
(转)通过几个例子看sed的模式空间与保持空间
来源: ChinaUnix博客  日期: 2007.09.27 23:08 (共有条评论) 我要评论
 

                        近来看到几个不是很常见,但是比较有用的sed例子,都和hold space与pattern space有关,于是对几个例子做了自己认为正确的解释,贴出来与大家共享并请指正,继续讨论
例子一
sed G
在文件每一行下面输出一个空行
CODE:
$ cat foo
11111111111111
22222222222222
33333333333333
44444444444444
55555555555555
$ sed G foo
11111111111111
22222222222222
33333333333333
44444444444444
55555555555555
解释:
sed 中 G 的用法
The
G function appends the contents of the holding area to the contents of
the pattern space. The former and new contents are separated by a
newline. The maximum number of addresses is two.
hold space : 保持空间(或者叫保留空间、缓冲区),初始为空
pattern space :模式空间
在上面的例子中,将为空的hold space附加到文件的每一行后面,所以结果是每一行后面多了一个空行
引申出:
sed '/^$/d;G'
在文件的每一个非空行下面输出一个空行
sed '/^$/d;G;G'
在文件的每一个非空行下面输出两个空行
CODE:
$ cat foo
11111111111111
22222222222222
33333333333333
44444444444444
55555555555555
$ sed '/^$/d;G' foo
11111111111111
22222222222222
33333333333333
44444444444444
55555555555555
注:有时会有一些由空格符或者TAB组成的空行,前面的正则式 ^$ 就不能匹配到这样的行,则可以这样
    sed '/[[]]/d;G'
例子二
sed '/regex/{x;p;x;}'
在匹配regex的所有行前面插入一个空行
CODE:
$ cat foo
11111111111111
22222222222222
test33333333333333
44444444444444
55555555555555
$ sed '/test/{x;p;x;}' foo
11111111111111
22222222222222
test33333333333333
44444444444444
55555555555555
解释:
sed 中 x 的用法
The
exchange function interchanges the contents of the pattern space and
the holding area. The maximum number of addresses is two.
即交换保持空间hold space和模式空间pattern space的内容
sed 中 p 的作用是把模式空间复制到标准输出。
分析一下该命令执行过程中保持空间和模式空间的内容
命令      保持空间                             模式空间
x     执行前:null   执行后:test\n         执行前:test\n 执行后:null
p     执行前:null   执行后:test\n         执行前:test\n 执行后:null         输出一个空行
x     执行前:test\n 执行后:null           执行前:null   执行后:test\n
(注:把test所在的行简写为test了)
引申:
可以试验一下 sed '/test/{x;p;}' foo  或者 sed '/test/{p;x;}' foo 等,看看结果,体会两个空间的变化
相应的:
sed '/regex/G'  是在匹配regex的所有行下面输出一个空行
sed '/regex/{x;p;x;G;}' 是在匹配regex的所有行前面和下面都输出一个空行
例子三
sed 'n;G;'
在文件的偶数行下面插入一个空行
CODE:
$ cat foo
11111111111111
22222222222222
33333333333333
44444444444444
55555555555555
$ sed 'n;G;' foo
11111111111111
22222222222222
33333333333333
44444444444444
55555555555555
解释:
sed 中 n 的用法:将模式空间拷贝于标准输出。用输入的下一行替换模式空间。
执行 n 以后将第一行输出到标准输出以后,然后第二行进入模式空间,根据前面对 G 的解释,会在第二行后面插入一个空行,然后输出;再执行 n 将第三行输出到标准输出,然后第四行进入模式空间,并插入空行,依此类推
相应的:
sed 'n;n;G'     表示在文件的第 3,6,9,12,... 行后面插入一个空行
sed 'n;n;n;G'   表示在文件的第 4,8,12,16,... 行后面插入一个空行
sed 'n;d'       表示删除文件的偶数行
例子四
sed '$!N;$!D'   
输出文件最后2行,相当于 tail -2 foo
CODE:
$ cat foo
11111111111111
22222222222222
33333333333333
44444444444444
55555555555555
$ sed '$!N;$!D' foo
44444444444444
55555555555555
解释:
D 删除模式空间内第一个 newline 字母 \n 前的资料。
N 把输入的下一行添加到模式空间中。
sed '$!N;$!D' : 对文件倒数第二行以前的行来说,N 将当前行的下一行放到模式空间中以后,D 就将模式空间的内容删除了;到倒数第二行的时候,将最后一行附加到倒数第二行下面,然后最后一行不执行 D ,所以文件的最后两行都保存下来了。
还有 N 的另外一种用法
CODE:
$ sed = foo | sed N
1
11111111111111
2
22222222222222
3
33333333333333
4
44444444444444
5
55555555555555
$ sed = foo | sed 'N;s/\n/        /'
1       11111111111111
2       22222222222222
3       33333333333333
4       44444444444444
5       55555555555555
解释:
N 的作用是加上行号,可以用于格式化输出文件
例子五
sed '1!G;h;$!d'
sed -n '1!G;h;$p'         
将文件的行反序显示,相当于 tac 命令(有些平台没有这个命令)
CODE:
$ cat foo
11111111111111
22222222222222
33333333333333
$ sed '1!G;h;$!d' foo
33333333333333
22222222222222
11111111111111
$ sed -n '1!G;h;$p' foo
33333333333333
22222222222222
11111111111111
解释:
sed 中 h 用法:h
The
h (hold) function copies the contents of the pattern space into a
holding area, destroying any previous contents of the holding area.
意思是将模式空间的内容保存到保持空间中去
sed 中的 d 表示删除模式空间。
1!G表示除了第一行以外,其余行都执行G命令;$!d表示除了最后一行以外,其余行都执行d命令。
看一下sed '1!G;h;$!d'命令执行过程中保持空间与模式空间的变化:
        命令                 保持空间                             模式空间
第一行  h;d     执行前:null        执行后:1111\n                执行前:1111\n 执行后:null
第二行  G;h;d   执行前:1111        执行后:2222\n1111\n          执行前:2222\n 执行后:null         
第二行  G;h     执行前:2222\1111\n 执行后:3333\n2222\n\1111\n   执行前:3333\n 执行后:3333\n2222\n\1111\n
(注:把各个行简写了)
这样输出以后就是文件的反序了。
题外话:在vi中对一个文件进行反序显示的命令是 :g/./m0 , 意思是按照文件正常顺序每找到一行,就把该行放到文件的最上面一行去,这样循环一下正好把文件的行反序显示了。
                       
                       
                       
                       
                       
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/44068/showart_391471.html
  发表评论 查看评论(共有条评论) 我要提问
 
 


最新资讯更多>> 
· 金山卫士开源计划首周源码下载..
· 谷歌劝说诺基亚采用Android操作..
· 11月份Linux市场占有率升至5%
· Apache 基金会确认退出 JCP 执..
· Chrome 10 新功能探秘:新增GP..
· 金山宣布开源其安全软件
· 开源FTP服务器ProFTPD发现后门
· 女黑客在开源会议上抱受骚扰
· 21款值得关注的Linux游戏
· 马化腾:腾讯半年后彻底转型,..
论坛热点更多>> 
· Linux系统移植从零开始!参与..
· 学习linux的意义在哪里
· 使用netfilter在哪能获取到原..
· 哥纠结了
· 一个在线读开源代码的工具,..
· 为什么我的目录下没有.cshrc..
· 初学linux从哪里开始
· linux 系统无法上网
· 新手安装UCenter 时总是出错..
· cacti添加主机显示的状态都是..
文档更新更多>> 
· 菜鸟入门三星ARM11嵌入式系统,是..
· 寻redhat 5.3 的中文手册 for ia64
· 请问redhat 5.3 企业版的用户手册..
· LINUX与UNIX SHELL编程指南(中文)
· 一些基本用户管理以及基本安装方法
· 菜鸟学习linux笔记与练习-----第..
· 菜鸟学习linux笔记与练习-----第..
· 服务器配置:Squid配置详解
· linux下u盘使用
· ubuntu dynamips 绑定网卡到虚拟机
 
关于我们 | 联系方式 | 广告合作 | 诚聘英才 | 网站地图 | 友情链接 | 免费注册

Copyright © 2001-2009 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们

京ICP证:060528号