sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
关于sed的hold space(内存缓冲区)和pattern space(模式空间)
sed在处理文件的时候,每一行都需要存放在一个叫“模式空间”的临时缓存区。每处理完一行,便清理一次(pattern space),并把下一行再次放入该临时缓冲区。
而保留空间(hole space),是当sed用到h命令的时候,把匹配的模式放在一个叫做"hold buffer"的保留缓冲里,但需要使用G(sed的取得命令)的时候,sed 从这个保留空间(hold space)中取得。
sed 是以行为单位进行读取,读取后的内容存放在pattern space。
holding space是通过h,H,x,g,G命令和pattern space产生关连,利用这5个特性可以辅助pattern space解决问题。
g
表示行内全面替换,当前处理行进行全局替换。
G
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
函数参数G 与g 唯一差别是, sed执行g 时, 数据盖掉(overwrite) pattern space 内原来的数据
而G , 数据则是"添加(append)" 在pattern space 原来数据后。
‘;’号
如果在一行中有多个命令,要用分号隔开。
s/re/string
用string替换正则表达式re。
d
从模板块(Pattern space)位置删除行。
函数参数d 表示删除数据行, 其指令格式如下:
[address1[ ,address2]] d
对上述格式有下面几点说明:
函数参数d 最多与两个地址参数配合。
sed执行删除动作情况如下:
将pattern space 内符合地址参数的数据删除。
将下一笔资料读进pattern space 。
重新执行sedscript。
n
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
函数参数n 表示读入下一行资料。
其指令格式如下:
[address1[ ,address2]] n
对上述格式有下面几点说明:
函数参数n 最多配合两个地址参数。
sed执行读入下一行动作的情况如下:
输出在pattern space 的数据。
将下一笔资料读到pattern space。
执行下一个编辑指令。
-n, --quiet, --silent
安静模式,取消默认输出。
x
交换pattern和hold space
p
打印模式空间的行,通常 p 会与参数 sed -n 一起使用
N
追加下一行数据到模式空间,数据行间以换行字符(embedded newline character)分隔。
函数参数N 表示添加下一笔资料在pattern space 内。
其指令格式如下:
[address1 ,[address2]] N
对上述格式有下面几点说明:
函数参数N 最多配合两个地址参数。
sed执行时, 将下一行数据读入并添加在pattern space 内, 数据行间以换行字符(embedded newline character)分隔。
此外, 在替换时, 换行字符可用\n 来match。
=
打印当前行号
.
匹配一个非换行符的字符
h
拷贝模板块的内容到内存中的缓冲区。
!
表示后面的命令对所有没有被选定的行发生作用。
$
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。也可以表示文件最后一行。
1
表示文件第一行
-e
直接在指令列模式上进行 sed 的动作编辑,允许多台编辑。
:label
表示建立一个标签label
b
跳转命令,这个命令是无条件跳转
ba表示跳转到标签a处
q
退出Sed。
D
删除模板块的第一行。
函数参数D 与d 的比较如下:
当pattern space 内只有一数据行时, D 与d 作用相同。
当pattern space 内有多行资料行时D 表示只删除pattern space 内第一行资料; d 则全删除。
D 表示执行删除后, pattern space 内不添加下一笔数据, 而将剩下的数据重新执行sedscript ; d 则读入下一行后执行sedscript。