日期: 2015年09月15日



Sed命令:Stream Editor (流编辑器/行编辑器)

读取文件时把文件所有内容加载至内核缓冲区中,一次只处理一行数据。


工作机制:

sed命令默认并不是直接编辑磁盘上文件本身的内容,而是由内核把文件加载至内存中(缓冲区),sed命令

自身在内部维护着一个内核存储空间,称为"模式空间"(pattern space)它会从内核缓冲区中一次加载

一行内容进来,在此空间内完成编辑,并把编辑的结果输出到屏幕上。



语法:

sed [OPTION]... {script} [input-file]...

         sed [options] 'addr1[,addr2]编辑命令' FILE...

         sed [options] "addr1[,addr2]编辑命令" FILE...



选项:

-n  静默模式,不输出模式空间中的内容

-r: 支持扩展正则表达式;

-e 'script1' -e 'script2' -e 'script3':指定多脚本运行;

-f /path/to/script_file:从指定的文件中读取脚本并运行;

-i: 直接修改源文件;



编辑命令:

d  删除

p  打印

\n  换行

i \char  在被模式匹配到的行的前一行插入内容

a \char  在被模式匹配到的行的后一行插入内容

r /PATH/TO/FILE  在指定位置把另外一个文件的内容插入进来

w /PATH/TO/FILE  将符合条件的所有行保存至指定的文件中

=  显示符合条件的行的行号

s///  查找条件可以使用模式,但要替换的内容不行



sed命令另一个称作"hold space"的内存空间


高级命令:

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

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

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

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

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

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

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

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

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



地址定界:

n  数字直接指定行

$  最后一行

/regexp/  任何能够被/regexp/所匹配到的行


startline,endline

1,3

#,/regexp/  从#行开始,到第一次被/regexp/所匹配到的行结束,中间的所有行

/regexp1/,/regexp2/:从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到的行结束,中间的所有行

#,+n  从#行开始,一直到向下的n行


注意:模式一定要在写在 '/ /' 之内

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


sed '地址定界s@查找条件@替换文件@'

   修饰符:

 g  global,全局替换

 i  ignore-case,不区分字符大小写

 

 

 

示例1

删除/etc/fstab文件中以#开头的行

sed命令——流编辑器_sed



示例2

删除/etc/fstab文件中以第一个#开头,至第一个/开头的行

sed命令——流编辑器_流编辑器_02



示例3

把/etc/inittab文件中 id:5:initdefault: 行中的数字5替换为3

sed命令——流编辑器_流编辑器_03



示例4

删除/etc/init.d/functions文件中行首的#号

sed命令——流编辑器_sed_04