码迷,mamicode.com
首页 > 其他好文 > 详细

字符及文本处理之sed:sed使用高级命令

时间:2015-09-25 18:44:55      阅读:425      评论:0      收藏:0      [点我收藏+]

标签:sed

三、sed高级编辑命令

     t,T,D,P,n,N,H,h,g,G

        前面的基本用法已经可以满足基本应用,但sed还有一些高级用法(装X利器),要学习sed高级命令首先要理解清楚sed的另一个缓冲区“保持空间”。

        前面基本用法中也有提到模式空间,即为处理文件中一行内容的一个临时缓冲区。处理完一行之后就会把模式空间中的内容打印到标准输出,然后自动清空缓存。

而这里说的保持空间是sed中的另外一个缓冲区,此缓冲区正如其名,不会自动清空,但也不会主动把此缓冲区中的内容打印到标准输出中。而是需要以下sed命令进行处理:

        注意:保持空间里默认存储一个空行

  •       d     Delete pattern space.  Start next cycle.    删除pattern space的内容,开始下一个循环.

  •       h、 H    Copy/append pattern space to hold space.   复制/追加pattern space的内容到hold space.

  •       g、 G    Copy/append hold space to pattern space.   复制/追加hold space的内容到pattern space.

  •       x      Exchange the contents of the hold and pattern spaces.    交换hold space和pattern space的内容.


下面以一个例子来说明上面命令的用法,例如有一个文件,我们可以用tac命令反序打印出文件的内容,其实用sed的话也可以实现,这里先将结果列出,再详细讲解


高级命令:

h:用模式空间中的内容覆盖保持空间的内容;

H:把模式空间中的内容追加至保持空间中内容的后面;

g:从保持空间中取到其内容,并将其覆盖模式空间中的内容;

G:从保持空间中取到其内容,并将其追加在模式空间中的内容的后面;

x:把保持空间和模式空间中的进行交换;

n:读取匹配到的行的下一行至模式空间;(会覆盖模式空间中的原有内容);

N:读取匹配到的行的下一行至模式空间,追加在模式空间中原有内容的后面;

d:删除模式空间中的内容;

D:删除多行模式空间中的首行;


注意:命令功能可使用!取反(对地址定界取反)  ;分号可用于分隔脚本;


   有点晕,找机会再来装吧,


)替换匹配行的下一行

   想要修改匹配行的下一行的文本,就需要使用n命令了,该命令的作用在于读取匹配行的下一行,然后再用n命令后的编辑指令来处理改行。

保持和获取:h命令和G命令 

    在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。 

sed -e ‘/test/h‘ -e ‘$G‘ file 

     在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。 

 

保持和互换:h命令和x命令 

     互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换: 

sed -e ‘/test/h‘ -e ‘/check/x‘ file 

示例:

sed ‘G‘ /etc/issue: 在文件中的每行后方添加空白行;

sed ‘$!d‘ /etc/fstab:保留最后一行;

sed ‘/^$/d;G‘ /etc/issue: 保证指定的文件每一行后方有且只有一个空白行;

sed ‘n;d‘ /etc/issue:保留奇数行;

sed -n ‘1!G;h;$p‘ /etc/issue

sed ‘$!N;$!D‘ /etc/issue


字符及文本处理之sed:sed使用高级命令

标签:sed

原文地址:http://xiexiaojun.blog.51cto.com/2305291/1698282

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!