[root@localhost linuxsed]# cat 1.txt
123
456
789
[root@localhost linuxsed]# sed '/5/p' 1.txt
123
456
456
789
[root@localhost linuxsed]#

和awk类似,sed 语句的基本结构也是 sed ‘模式{动作1;动作2}’file 。同样也是匹配模式才执行动作。不过sed中有两个空间大家一定要记住,一个叫pattern space(模式空间),一个叫hold buffer(缓冲区/缓冲空间),sed中的模式匹配的对象只是模式空间,而动作{p,d,n,g..etc}则的对象是模式空间和缓冲空间。和awk一样,sed也是一行一行的读入文本,不过sed在执行命令前,会将文本的行读到模式空间中,然后执行模式{动作}语句,而在执行命令完后,默认sed还是把模式空间的内容打印出来(通过-n 参数可以把最后默认打印模式空间的动作取消)。在上面的例子中,首先sed把123读入到模式空间中,由于模式/5/不匹配123,因此后面动作p(打印当前模式空间的内容)也就不执行了,正如之前说的,sed在读入下一行456之前会执行默认的打印动作p,把123打印出来。继续读下一行456,由于模式/5/匹配456,执行动作p把456打印出来,而后默认又打印了一次456。这就是sed命令的一个基本流程。当然大多数情况下我们只是想要把匹配模式的内容打印出来,这里加一个-n参数就可以了。
Tips:在sed读入下一行前会把模式空间清空,所以当读第二行456的时候,模式空间内的123已经没了。