It's our wits that make us men.

sed用法

Posted on By Junliang Huang

sed用法

1.基本用法:

它是一种在线编辑器、一次处理一行内容,主要用来自动编辑一个或多个文件;简化对文件的反复操作。

1.1 sed 参数

-n:使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。

-i:直接修改读取的档案内容,而不是由萤幕输出。

例如:

[root@localhost junliang]# sed -n '1,2p' aa
aa
bb
[root@localhost junliang]# sed '2d' aa
aa
cc
[root@localhost junliang]# sed 's/aa/&jun/' aa
aajun
bb
cc
&符号表示替换换字符串中被找到的部份,所有aa的行都会被替换成它自已加jun,变成aajun。

[root@localhost junliang]# sed 's#aa#ss#' aa
ss
bb
cc
不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有aa替换成ss。

[root@localhost junliang]# sed -n 's/\(a\)a/\1ss/p' aa
ass

a被标记为1,所有aa会被替换成ass,而且替换的行会被打印出来。

2.高级用法,模式空间和保持空间

sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holdingspace)这2个空间的使用。

sed编辑器逐行处理文件,并将输出结果打印到屏幕上。sed命令将当前处理的行读入模式空间(pattern space)进行处理,sed在该行上执行完所有命令后就将处理好的行打印到屏幕上(除非之前的命令删除了该行),sed处理完一行就将其从模式空间中删除,然后将下一行读入模式空间,进行处理、显示。处理完文件的最后一行,sed便结束运行。sed在临时缓冲区(模式空间)对文件进行处理,所以不会修改原文件,除非显示指明-i选项。

与模式空间和暂存空间(hold space)相关的命令:

n 输出模式空间行,读取下一行替换当前模式空间的行,执行下一条处理命令而非第一条命令。
N 读入下一行,追加到模式空间行后面,此时模式空间有两行。
h 把模式空间里的行拷贝到暂存空间。
H 把模式空间里的行追加到暂存空间。
g 用暂存空间的内容替换模式空间的行。
G 把暂存空间的内容追加到模式空间的行后。
x 将暂存空间的内容于模式空间里的当前行互换。
! 对所选行以外的所有行应用命令。
注意:暂存空间里默认存储一个空行。

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的内容.

例如:用sed反序打印出文件的内容

[root@localhost junliang]# cat aa
aa
bb
cc
[root@localhost junliang]# sed '1!G;h;$!d' aa
cc
bb
aa

看一下sed '1!G;h;$!d;'命令执行过程中暂存空间与模式空间的变化:

处理行      命令       暂存空间(hold space)         模式空间(pattern space)                                                               
第一行      h;d      执行前:null 执行后:aa\n                 执行前:aa\n 执行后:null                                                                                  
第二行      G;h;d    执行前:aaa 执行后:bb\n\aa\n             执行前:bb\n 执行后:null                            
最后一行    G;h      执行前:bb\n\aa\n 执行后:cc\bb\n\aa\n    执行前:cc\n 执行后:cc\n\bb\n\aa\n

3.参考文献

1.http://leowzy.iteye.com/blog/1453421

2.https://www.2cto.com/kf/201604/504063.html

3.http://blog.chinaunix.net/uid-26805356-id-4088668.html