sed 工作原理
sed即Stream Editor,和vi不同,sed是行编辑器。
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(Pattern Space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快。
Sed 基本用法
格式:
sed [-Options] 'script;script;...' filename
其中script是一个sed命令,sed命令一定要被包含在一对单引号中,可以是多个
常用选项:
-n 不自动打印
-e 多点编辑
-f 从指定文件中读取编辑脚本
-r,-E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
-s 将多个文件视为独立文件,而不是单个连续的长文件流
注:
-ir 不支持
-i -r 支持
-ri 支持
-ni 危险选项,会清空文件
script命令格式:地址(比如哪些行)+命令(比如增删改查)
1.不给地址:对全文进行处理 (默认自动打印)
P 打印当前模式空间的内容,追加到默认输出之后(不取消自动打印会重复打印)
-n 关闭默认打印
2. 单地址
#:指定的行
sed -n '3p' passwd
$:最后一行
sed -n '$p' passwd
/pattern/:被此模式所能够匹配到的每一行
打印 etc/fstab 非#号行 :sed -n '/^[^#]/p' /etc/fstab
3.地址范围
#,# 从第#行到第#行,如3,6 从第3行到第7行
seq 10 | sed -n '3,6p'
#,+# 从第#行到第+#行,如3,+4 从第3行到第7行
/pat1/ ,/ pat2/ 打印以d开头的行到以s开头的行
sed -n '/^d/,/^s/p' /etc/passwd
4.步进:~
1~2 奇数行
2~2 偶数行
命令:
Ip 忽略大小写输出
d 删除模式空间匹配的行,并立即启用下一轮循环
a [\]test 在指定行后面追加文本,支持使用\n实现多行追加
多行追加
i [\]test 在行前面插入文本
c [\]test 替换行为单行或多行文本
w file 保存模式匹配的行至指定文件
sed -n '/^b/w ./sedleatn/sed.log' /etc/passwd
r file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
正则表达式
. 代表且只能代表一个字符
\ 转义字符。例\.就只代表本身
* 重复0个或多个前面的一个字符,例o*匹配没有o,有1个o或多个oooooo
.* 匹配所有字符
^word 匹配以world开头的内容 vi/vim 里面^代表一行的开头
word$ 匹配以word结尾的内容 vi/vim 里面$代表一行的结尾
^$ 表示空行
[abc] 匹配字符集合内的任意一个字符[a-zA-Z],[0-9]
[^abc] 匹配不包含^之后的任意一个字符的内容
a\{n,m\} 重复n到m次,前一个重复的字符。如果用egrep/sed -r 可以去掉斜线
a\{n,\} 重复至少n次,前一个重复的字符。如果用egrep/sed -r 可以去掉斜线
a\{n\} 重复n次,前一个重复的字符。如果用egrep/sed -r 可以去掉斜线
a\{,m\} 最多m次
+ 表示重复“一个或一个以上”前面的字符(*是0或多个)
? 表示重复“0个或一个”前面的字符(.是有且只有1个)
| 表示同时过滤多个字符串
() 表示分组过滤,后向引用