1. sed的定义
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快。
2. sed编辑器的工作流程
sed 的工作流程主要包括读取、执行和显示三个过程:
读取: sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中。
执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行, 除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流(屏幕)。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
3. 命令格式
sed [option]... 'script;script;...' [input file...]
选项 自身脚本语法 支持标准输入管道
常用选项:
-n | 不输出模式空间内容,即不自动打印,加p恢复自动打印 |
-e | 多点编辑 |
-f | 从指定文件中读取编辑脚本 |
-r -E | 使用扩展正则表达式 |
-i | 备份文件并原处编辑 |
常用语法选项:
p | 手动打印 |
q | 提前退出(3q在第三行退出) |
a | 追加(3a在第三行后面追加) |
i | 上方插入(3i在第三行上方插入) |
c | 替换(3c将第三行整行替换) |
d | 删除(3d删除第三行) |
= | 显示行号 |
4. sed实例
上方插入
打印指定多行内容
提前退出
删除
替换
显示行号
不打印特定的行
打印最后一行
打印范围内容
sed -n '//,//p' 文件名
#第一个//表示开头位置,第二个//表示结尾位置
sed -n '/^r/,/^f/p' /etc/passwd
#以r开头 f开头结尾 第二轮以r开头 后面没有以f开头结尾 则显示全部
'#,/关键字/p'从第#行开始匹配
‘/关键字/,#’ 找到第#个关键字为止
seq 10 |sed -n '1~2p'
seq 10 |sed '2~2d'
#打印奇数行
seq 10 |sed -n '2~2p'
seq 10 |sed '1~2d'
#打印偶数行
5. 搜索替代
格式:格式:sed 行范围 s/旧字符串/新字符串/替换标记
s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
I,i 忽略大小写
修改selinux开机不自启配置文件
全局替换
查看日志
6. 分组调用
#分组使用()(),调用第一段使用\1
分别调用第一组,第二组,第三组