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