sed
Stream EDitor:流编辑
sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;
- sed格式主要分两种
1. Sed 选项 命令 文件 sed [options] 'command' file(s)
2. Sed 选项 –f 脚本 文件 sed [options] -f scriptfile file(s)
返回值都是0,只有当命令存在错误是。Sed退出状态是非0
- Sed的正则表达式
与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。正则表达式是括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。
基本元字符集 ^ , $ , . ,* ,[ ] , [^] , < > , () , {}
扩展元字符 ? , + , | , () ,
使用方式 + 转义 sed –r
命令汇总
- 删除命令:d
(1)Sed –r ‘/root/d’ passwd
匹配词组删除
[root@localhost ~]# sed -r '/root/d' passwd
bin:x:1:1:bin:/bin:/sbin/nologin2
daemon:x:2:2:daemon:/sbin:/sbin/nologin3
adm:x:3:4:adm:/var/adm:/sbin/nologin4
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5
sync:x:5:0:sync:/sbin:/bin/sync6
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7
halt:x:7:0:halt:/sbin:/sbin/halt8
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9
(2)sed –r ‘3d’ passwd 删除第三行
[root@localhost ~]# sed -r '3d' passwd
root:x:0:0:root:/root:/bin/bash1
bin:x:1:1:bin:/bin:/sbin/nologin2
adm:x:3:4:adm:/var/adm:/sbin/nologin4
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5
sync:x:5:0:sync:/sbin:/bin/sync6
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7
halt:x:7:0:halt:/sbin:/sbin/halt8
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9
operator:x:11:0:operator:/root:/sbin/nologin10
(3)sed –r ‘3{d}’ passwd 与上例一致
(4)sed –r ‘3{d;}’ passwd 大括号中可存sed多个命令 例3{h;d} h 暂存空间
(5)sed –r ‘3,$d’ passwd 删除3到最后一行
删除3到最后一行
[root@localhost ~]# sed -r '3,$d' passwd
root:x:0:0:root:/root:/bin/bash1
bin:x:1:1:bin:/bin:/sbin/nologin2
(6)sed –r ‘$d’ passwd 删除最后一行
- 替换命令:s
(1)Sed –r ‘s/root/aofa/’ passwd 把passwd文件中的root替换成aofa
(2)sed –r ‘s/^root/aofa/’ passwd 以root开始的词组,替换成aofa
(3)sed –r ‘s/root/aofa/g’ passwd 把所有的root全换成aofa
(4)sed –r ‘s/[0-9][0-9]$/&.5/’ passwd
查找双数 结尾的词组&:替换成双数.5 &有查询结果的含义。
如果去掉$ 所有双数都会换掉
(5)sed –r ‘s/(mail)/E\1/g’ passwd ()括号组合字符,\1调用括号
[root@localhost ~]# sed -r 's/(mail)/E\1/g' passwd
Email:x:8:12:Email:/var/spool/Email:/sbin/nologin9
(6) sed -r 's#(mail)#E\1#g' passwd 分隔符可以换成井号
- 读文件命令:r
首先编辑1.txt 文件
(1)sed –r ‘$r 1.txt’ passwd
最后一行,读取新文件1.txt
(2)sed –r ‘/root/r 1.txt’ passwd
在root后面读取新文件
- 写文件命令:w(另存为)
(1) sed –r ‘w 111.txt ’ 1.txt 把1.txt全部内容写入111.txt
(2) sed –r ‘1,5w 123.txt’ passwd 把1,5行另存为123.txt
[root@localhost ~]# sed -r '1,5w 123.txt' passwd
root:x:0:0:root:/root:/bin/bash1
bin:x:1:1:bin:/bin:/sbin/nologin2
daemon:x:2:2:daemon:/sbin:/sbin/nologin3
adm:x:3:4:adm:/var/adm:/sbin/nologin4
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5
sync:x:5:0:sync:/sbin:/bin/sync6
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7
halt:x:7:0:halt:/sbin:/sbin/halt8
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9
operator:x:11:0:operator:/root:/sbin/nologin10
[root@localhost ~]# cat -n 123.txt
1 root:x:0:0:root:/root:/bin/bash1
2 bin:x:1:1:bin:/bin:/sbin/nologin2
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin3
4 adm:x:3:4:adm:/var/adm:/sbin/nologin4
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5
- 追加命令:a(之后)
(1) sed –r ‘a123’ passwd 每行后面,加上123行
(2) sed –r ‘2a123’ passwd 2行后面,加上123行
(3) sed –r ‘2a1111\ 插入段落,要用\转义掉回车
2222\ 分号结束
3333’ passwd
- 插入命令:i(之前)
(1) sed –r ‘2iaaaa’ passd 在第二行插入新行aaaa
[root@localhost ~]# sed -r '2iaaaaaaaa' passwd
root:x:0:0:root:/root:/bin/bash1
aaaaaaaa
bin:x:1:1:bin:/bin:/sbin/nologin2
daemon:x:2:2:daemon:/sbin:/sbin/nologin3
adm:x:3:4:adm:/var/adm:/sbin/nologin4
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin5
sync:x:5:0:sync:/sbin:/bin/sync6
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown7
halt:x:7:0:halt:/sbin:/sbin/halt8
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin9
operator:x:11:0:operator:/root:/sbin/nologin10
(2) sed –r ‘2iaaaa\ 插入段落与上面一致
bbbb\
ccccc’ passwd
- 替换整行命令:c
(1) sed –r ‘2caaaa’ passwd 把第二行替换成aaaa
(2) sed –r ‘2c1111\ 将一行替换成多行
2222\
3333’ passwd
- 获取下一行命令:n
(1) sed –r ‘/root/{n;d}’ passwd n下一行的意思 找root行的下一行,删除
(2) sed –r ‘/root/{n;s/bin/ding/g}’ passwd 找到root行的下一行查找替换
- 反向选择:!
(1) sed –r ‘2,$d’ passwd 以上有
(2) sed –r ‘2,$!d’ passwd 删除2行到最后一行以外的(第一行)
- 多重编辑:e
(1) sed –r ‘1,3d’ –e ‘4s/adm/adnin/g’ passwd
(2) sed –r ‘1,3d;4s/adm/admin/g’ passwd 与(1)一致
(3) sed –r ‘2s/bin/ding/g;2s/nologin/bash/’ passwd
(4) sed –r ‘2{s/bin/ding/g;s/nologin/bash/}’ passwd 括号省了范围
删除配置文件中#号的注释行
Sed –r ‘/^#/d’ /etc/yum.conf
修改文件
Sed –ri ‘$a\cheoot_local_user=YES’ /etc/yum.conf z在最后一行追加
Sed –r ‘/^SELINUX=/Cselinux=disabled’ /etc/selinux/config 换行c
给文件行添加注释
Sed –r ‘2,6s/^/#/’ a.txt 2到6行 换成#
Sed –r ‘2.6s/(.*)/#\1/’ a.txt ()内容可以被\1引用
Sed –r ‘2,6s/.*/#&/’ a.txt &匹配前面查找的内容
外部变量
创建var1=1111
追加变量
Sed –r “1a$var1” /etc/hosts
第一行后追加变量$var1
[root@localhost ~]# sed -r "1a$var1" /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
111111
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
调用变量 ,使用单引号是错误的