sed模式空间和暂存空间的区别

学了sed,觉得模式空间和暂存空间比较乱 整理一下

sed编辑器逐行处理文件,并将输出结果打印到屏幕上。sed命令将当前处理的行读入模式空间(pattern 
space)进行处理,sed在该行上执行完所有命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行),sed处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理、显示。处理完文件的最后一行,sed便结束运行。sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明-i选项。
与模式空间和暂存空间(hold space)相关的命令:
n 输出模式空间行,读取下一行替换当前模式空间的行,执行下一条处理命令而非第一条命令。
N 
读入下一行,追加到模式空间行后面,此时模式空间有两行。
h 把模式空间里的行拷贝到暂存空间。
H 把模式空间里的行追加到暂存空间。
g 
用暂存空间的内容替换模式空间的行。
G 把暂存空间的内容追加到模式空间的行后。
x 将暂存空间的内容于模式空间里的当前行互换。
! 
对所选行以外的所有行应用命令。
注意:暂存空间里默认存储一个空行。
下面是一些例子:
cat datafile
111111111111 aaa
222222222222 bbb
333333333333 
ccc
444444444444 ddd
555555555555 eee
666666666666 fff
在每行后面加一空行:
sed ‘G‘ datafile
111111111111 aaa
222222222222 bbb
333333333333 ccc
444444444444 ddd
555555555555 eee
666666666666 fff
aaa行被读入模式空间,执行G,在此行后面追加一个空行,然后打印模式空间,其他行同理。
在匹配行后加一空行:
sed ‘/ccc/G‘ datafile
111111111111 aaa
222222222222 bbb
333333333333 
ccc
444444444444 ddd
555555555555 eee
666666666666 fff
在匹配行前加入一个空行:
sed ‘/ccc/{x;p;x;}‘ datafile
111111111111 aaa
222222222222 bbb
333333333333 ccc
444444444444 ddd
555555555555 eee
666666666666 
fff
命令执行前后暂存空间和模式空间的变化情况:
命令     暂存空间                                         模式空间
x           
执行前:null 执行后:ccc\n              执行前:ccc\n 执行后:null
p          执行前:null 
执行后:ccc\n              执行前:ccc\n 执行后:null 输出一个空行
x          执行前:ccc\n 
执行后:null              执行前:null 执行后:ccc\n 输出ccc所在行
(注:把ccc所在行简写为ccc)
删除偶数行:
sed ‘{n;d;}‘ datafile
111111111111 aaa
333333333333 ccc
555555555555 
eee
执行n后打印第一行,然后读入第二行执行d命令,即删除此行;然后在执行n打印第三行,然后读入第四行执行d命令,依此类推。
在偶数行后添加一新行:
sed ‘{n;G;}‘ datafile
111111111111 aaa
222222222222 bbb
333333333333 ccc
444444444444 ddd
555555555555 eee
666666666666 fff
执行 n 以后将第一行输出到标准输出以后,然后第二行进入模式空间,根据前面对 G 的解释,会在第二行后面插入一个空行,然后输出;再执行 n 
将第三行输出到标准输出,然后第四行进入模式空间,并插入空行,依此类推。
相应的:sed ‘{n;n;G;}‘ datafile 表示在文件的第 
3,6,9,12,… 行后面插入一个空行。
将偶数行置空:
sed ‘{n;g;}‘ datafile
111111111111 aaa
333333333333 ccc
555555555555 eee
执行n后打印第一行,然后读入第二行执行g命令,g命令用暂存空间内容(null)来替换当前模式空间,即第二行被置空。其它行依此类推。
合并偶数行到上一行:
sed ‘{N;s/\n/\t/;}‘ datafile
111111111111 aaa 222222222222 
bbb
333333333333 ccc 444444444444 ddd
555555555555 eee 666666666666 
fff
执行N,将第二行追加到模式空间的第一行后,此时模式空间用两行,然后执行替换(s)将第一个换行符替换成tab。其它行依此类推。
加行号,大致相当于cat -n datafile:
sed = datafile
1
111111111111 aaa
2
222222222222 
bbb
3
333333333333 ccc
4
444444444444 ddd
5
555555555555 
eee
6
666666666666 fff
sed = datafile |sed ‘{N;s/\n/\t/;}‘
1 111111111111 aaa
2 222222222222 
bbb
3 333333333333 ccc
4 444444444444 ddd
5 555555555555 eee
6 
666666666666 fff
输出文件最后2行,相当于 tail -2 datafile
sed ‘{$!N;$!d;}‘ datafile
555555555555 eee
666666666666 fff
sed ‘{$!N;$!d;}‘ : 对文件倒数第二行以前的行来说,N 将当前行的下一行追加到模式空间中以后,D 
就将模式空间的内容删除了;到倒数第二行的时候,将最后一行追加到倒数第二行下面,然后最后一行不执行 d(!对所选行-此处是最后一行,以外的行执行命令) 
,所以文件的最后两行都保存下来了。
将文件的行反序显示,相当于 tac 命令:
sed ‘{1!G;h;$!d;}‘ datafile
666666666666 fff
555555555555 
eee
444444444444 ddd
333333333333 ccc
222222222222 bbb
111111111111 
aaa
1!G表示除了第一行以外,其余行都执行G命令;$!d表示除了最后一行以外,其余行都执行d命令。
看一下sed ‘{1!G;h;$!d;}‘命令执行过程中暂存空间与模式空间的变化:
处理行        命令         
暂存空间                                                                          
模式空间
第一行        h;d           执行前:null 
执行后:aaa\n                                             执行前:aaa\n 
执行后:null
第二行        G;h;d       执行前:aaa 
执行后:bbb\n1111\n                                 执行前:bbb\n 执行后:null
最后一行    
G;h          执行前:eee\n…aaa\n 执行后:fff\n…bbb\n\aaa\n       执行前:eee\n 
执行后:fff\n…bbb\n\aaa\n

sed模式空间和暂存空间的区别,布布扣,bubuko.com

时间: 2024-10-22 01:12:10

sed模式空间和暂存空间的区别的相关文章

在非归档模式下不能更改表空间为备份模式

Oracle表空间设置为备份模式后,便可以联机对表空间下数据文件进行文件系统级别的copy备份操作,因为期间对表空间的修改都记录到数据库的重做日志文件中. 由此想到数据库如果是非归档模式,那么这个表空间备份模式的时间必须不能超过联机日志被覆盖的时间,才能保证数据的修改不会丢失. 那么Oracle对这种情况是如何择决的呢? 实验表明:Oracle是干脆不让你在非归档模式下开启表空间的备份模式. 报错如下: ORA-01123: cannot start online backup; media r

Orange's笔记(2)保护模式(暂存)

1:GDT的第一项总为空,称为空段描述符,其结构如下: G:=0的时候段长度单位为字节 ,=1的时候单位为4096字节,所以段长度可以达到2的20(段接线2+段界限1)次方*4096=4GB DPL:描述符特权级,定义了被引用段的特权级,其值为0-3 S和TYPE:确定该段类型,S=1代码段和数据段描述符.s=0系统段描述符. 2:就WINDOWS而言,LDT是依个孤立的数据结构 3:GTDR是一个特殊的寄存器,它用来保存GDT的基地址,该寄存器的大小为48位,低16位存储GDT的大小,高32位

Photoshop入门教程(二):暂存盘设置与标尺设置

新建文档之后大家就可以对图像进行编辑.在对图像进行编辑之前,先来了解一下如何查看图像的一些基本信息.在软件左下角,会有这样的信息显示窗口. 1窗口表示当前图像显示比例,200%代表当前为放大两倍显示.左键双击可修改显示比例. 2窗口显示当前文档所占空间,鼠标放到图示位置按住左键不放,出现3窗口,显示当前图像信息. 暂存盘设置 Photoshop暂存盘默认情况下是在C盘,但是C盘作为系统盘空间有限,当处理大型文档时,C盘空间就会不够用.同时系统响应速度也会下降.那么如何修改暂存盘? 菜单栏:编辑—

git暂存工作区stash

本文git版本1.9.6 git名称stash:帮助开发人员暂时搁置当前已做的改动,倒退到改动前的状态,进行其他的必要操作(比如解决一个bug等),待解决bug后重新载入之前搁置的改动. 可以把执行stash动作想象为将当前commit状态临时保存到一个空间(栈内存): 示例: 可以看到stash动作使状态恢复到未修改前: 1. 主要命令 git stash                       #丢进暂存区 git stash list                  #列出所有暂存区

共享表空间与独立表空间、frm,MYD,MYI.idb,par文件说明

一.共享表空间与独立表空间MySQL5.5默认是共享表空间 ,5.6中,默认是独立表空间. 共享表空间:ibdata1是InnoDB的共享表空间,默认配置是把全部表空间存放到ibdata1中,因此而造成ibdata1文件无限增长需释放之说.优点:可以放表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同步的文件上).数据和文件放在一起方便管理.缺点:1. 大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间.2.

表空间及组成表空间的物理文件

相关文件: fil0fil.h fil0fil.c 功能:对disk上的表空间及组成表空间的物理文件进行管理(如新建,打开,关闭,删除,重命名等操作):对表空间中的页在物理文件上进行存取(IO操作). Introduction 表空间的物理组成 Innodb在对数据库文件的管理上使用了类似oracle的表空间(tablespace)技术.表空间只是逻辑上的管理方法,数据库的存储在物理上仍是按文件进行.在innodb中有三种表空间:系统表空间(也被称为共享表空间),重做日志表空间和独立表空间.这三

mysql InnoDB引擎 共享表空间和独立表空间(转载)

PS:innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间. 1.什么是共享表空间和独占表空间 共享表空间以及独占表空间都是针对innodb表的数据存储而言的,ibdata1为innodb引擎的存储数据与索引的数据文件,ib_logfile0与ib_logfile1为innodb引擎使用的日志文件共享表空间: mysql服务器中所有数据库的innodb表(数据,索引)全部放在一个文件中,默

git stash暂存文件

git stash 可用来暂存当前正在进行的工作, 比如想pull 最新代码,但又不想提交代码.先git stash暂存,pull之后,用git stash pop或者git stash apply取回暂存的代码继续修改. git stash --help可以查看git stash的帮助信息. git stash pop取回最后一次暂存的信息,并在暂存列表中删除. git stash list列出已有的多次暂存的信息. git stash apply [email protected]{0}也可

git 教程(5)--工作区和暂存区

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 工作区(working directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区: 版本库 (repository) 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库. Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD. 分支和HEAD的概念我们