标签: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
原文地址:http://xiexiaojun.blog.51cto.com/2305291/1698282