首页 > 代码库 > sed模式空间和暂存空间的区别
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
本文出自 “落日余晖” 博客,请务必保留此出处http://whluwit.blog.51cto.com/2306565/1438159
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。