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

 更新时间:2013年01月23日 18:11:39   作者:  
很多朋友对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

(注:把各个行简写了)

相关文章

  • shell实现贪吃蛇的示例代码

    shell实现贪吃蛇的示例代码

    本文主要介绍了shell实现贪吃蛇的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • linux下监视进程 崩溃挂掉后自动重启的shell脚本

    linux下监视进程 崩溃挂掉后自动重启的shell脚本

    如何保证服务一直运行?如何保证即使服务挂掉了也能自动重启?在写服务程序时经常会碰到这样的问题。在Linux系统中,强大的shell就可以很灵活的处理这样的事务
    2013-06-06
  • Bash Shell脚本学习小结

    Bash Shell脚本学习小结

    今天需要写一个Shell脚本。很简单,判断一个日志文件是否大大于2G,如果大于2G则删除。久了没有写bash,竟然一点都想不起来写了。于是复习了一下,下面对今天的学习做个小结
    2013-01-01
  • linux shell编程指南之字符串与数组

    linux shell编程指南之字符串与数组

    这篇文章主要给大家介绍了关于linux shell编程指南之字符串与数组的相关资料,字符串与数组是Shell编程中常用的数据类型,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Shell执行脚本并输出日志文件的方法

    Shell执行脚本并输出日志文件的方法

    这篇文章主要介绍了Shell执行脚本并输出日志文件的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Linux命令之cat和tail的用法介绍

    Linux命令之cat和tail的用法介绍

    这篇文章主要,给大家带来的是 Linux 命令系列,要介绍的是两个常用的查看文件内容的命令:cat 和 tail 命令,文中代码示例介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • 编写shell脚本实现tomcat定时重启的方法

    编写shell脚本实现tomcat定时重启的方法

    这篇文章主要介绍了编写shell脚本实现tomcat定时重启的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Linux下服务器重启的脚本命令

    Linux下服务器重启的脚本命令

    Linux关闭和重启系统一般使用相同的命令可以实现。下面脚本之家小编给大家带来了Linux下服务器重启的脚本命令,感兴趣的朋友一起看看吧
    2017-09-09
  • Linux中的搜索文件命令

    Linux中的搜索文件命令

    这篇文章主要介绍了Linux中的搜索文件命令的相关资料,需要的朋友可以参考下
    2017-07-07
  • ubuntu与centos中更换ip的shell代码

    ubuntu与centos中更换ip的shell代码

    ubuntu与centos中更换ip的shell代码,需要的朋友可以参考下
    2013-02-02

最新评论