流编辑器sed
sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。
在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式地插入、删除或替换数据中的文本。
流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
语法
sed [options] command file(s)
sed [options] -f scriptfile file(s)
sed 的返回值总是0,不管是否找到指定模式,退出状态总是0;
只有当命令存在语法错误是,退出状态才是非0;
支持正则表达式:sed -r 可以支持扩展元字符 \
基本用法
#打印,sed常用作文件修改,打印使用较少
sed -r 'p' file
#替换,和在vim中的操作一致,/符号可以更换
sed -r 's/root/alice/' filename
sed -r 's#root#alice#' filename
#查找,依然查找上面的字符,必须转义,d表示删除
sed -r '\#root#d' filename
#删除,从am开头的行删除到20行
sed -r '/^am/,20d' filename
#删除,从am开头的行再删除20行
sed -r '/^am/,20d' filename
#删除奇数行
sed -r '1~2d' filename
#删除偶数行
sed -r '0~2d' filename
sed命令
命令 | 功能 |
---|---|
s | 替换,g行内全局替换;i忽略大小写 |
a | 在当前行添加一行或多行 |
c | 使用新文本替换当前行中的文本 |
d | 删除行 |
i | 在当前行之前插入文本 |
l | 列出费打印字字符 |
p | 打印行 |
n | 读入下一输入航 |
q | 结束或退出sed |
! | 对所选航以外的所有行应用命令 |
r | 从文件中读写 |
w | 将行写入文件 |
y | 将字符串转换为另一字符串(不支持正则) |
h | 把模式空间的内容复制到缓冲区 |
选项
选项 | 功能 |
---|---|
-e | 允许多项编辑 |
-f | 指定sed脚本文件名 |
-n | 取消默认输出 |
-i | inpalce就地编辑 |
-r | 支持扩展元字符 |
例子
#在{}中写多个命令
sed -r '3{h;d}' filename
#删除最后一行
sed -r '$d' filename
#&符号表示匹配到的内容,一到五行前面加#
sed -ri '1,5s/.*/#&/' filename
#在第二个字符前加#
sed -ri 's/(.)(.)(.*)/\1#\2\3/' filename
#读到某个位置后在读取其他文件
#读到l在读取其他文件
sed -r '/l/r filename2' filename1
#写入文件
sed -r '3,$w newfile' filename1
#追加,第二行追加hello
sed -r '2a\hello' filename1
#替换,第二行替换成hello
sed -r '2chello' filename1
#插入,第二行插入kkkk
sed -r '2ikkkk' filename1
#找到下一行,进行操作
sed -r '/hello/{n;d}' filename
复杂例子
#删除注释行,一般注释以空格或\t(tab)开头,后面接#
sed -ri '/^[ \t]*#/d' filename
#删除配置文件中//注释的行
sed -ri '\#^[ \t]*//#d' filename
#删除空行
sed -ri '/^[ \t]*$/d' filename