日期: 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文件中以#开头的行
示例2:
删除/etc/fstab文件中以第一个#开头,至第一个/开头的行
示例3:
把/etc/inittab文件中 id:5:initdefault: 行中的数字5替换为3
示例4:
删除/etc/init.d/functions文件中行首的#号