介绍--逐行处理模式
非交互式的编辑器,处理时,会把文本先存储在临时缓冲区,叫模式空间,文件不会改变,只会显示在屏幕上,周到使用重定向输出
格式
sed [选项] '命令' 文件
sed 选项-f 脚本 文件
返回值
一般都是0,不管对错,除非命令输错
sed与正则
使用方式
\ +
sed -r
sed -r
命令
删除命令:d
head -10 /etc/passwd > passwd.txt
# i是追加到文件
sed -r '/root/d' passwd.txt
sed -r '3d' passwd.txt
sed -r '3{d}' passwd.txt
#一般要加大括号,不加也行
sed -r '3{d;}' passwd.txt
#分号隔开命令
sed -r '3,$d' passwd.txt
#删除3到最后一行
sed -r '$d' passwd.txt
#删除最后一行
替换命令: s(常用)
sed -r 's/root/aofa/' passwd.txt
#s///与vim中一样
sed -r 's/^root/aofa/' passwd.txt
#只换行首的一个
sed -r 's/root/aofa/g' passwd.txt
#g全局选项,换整行的
sed -r 's/[0-9][0-9]$/&.5/' passwd.txt
#把10换位10.5
sed -r 's/(mail)/E\1/' passwd.txt
#mail改为Email
sed -r 's#(mail)#E\1#' passwd.txt
# /可以替换为#,解决文件中有/的问题,如果要替换/
读文件命令: r
sed -r '$r 1.txt' paswd.txt
#把1.txt中的文件追加到行尾
#如果不加$,会在每一行都加一边
sed -r '/^root/r 1.txt' passwd.txt
#在第一行后追加
写文件命令:w(另存为)
sed -r 'w 111.txt' 1.txt
sed -r '/root/w 123.txt' 456.txt
sed -r '1,5w 123.txt' 456.txt
追加命令: a(之后)
sed -r 'a123' passwd.txt
#每行都加
sed -r '2a123' passwd.txt
sed -r '2a 1111\
222222\
3333333' passwd.txt
#追加三行
追加命令: i(之前)
ed -r 'i123' passwd.txt
#每行都加
sed -r '2i123' passwd.txt
sed -r '2i 1111\
222222\
3333333' passwd.txt
#追加三行
替换整行命令:c(常用)
sed -r '2caaaaaaaaaaaaaaaaaaaaaaaaa' passwd.txt
获取下一行命令: n
sed -r '/root/{n;d}' passwd.txt
#删除root下一行
sed -r '/root/{n;s/bin/ding/g}' passwd.txt
#root下一行的bin换为ding
反向选择: !
sed -r '2,$d' passwd.txt
sed -r '2,$!d' passwd.txt
多重编辑 : e
sed -r '1,3d' -e '4s/adm/admin/g' passwd.txt
sed -r '1,3d;4s/adm/admin/g' passwd.txt
sed -r '2s/bin/ding/g;2s/nologin/bash/' passwd.txt
sed -r '2{s/bin/ding/g;s/nologin/bash/}'
示例
#删除配置文件中的#配置
sed -ri '/^#/d' /etc/vsftpd/vsftpd.conf
#修改文件
sed -ri '$a chroot_local_user=YES ' /etc/conf
sed -ri '/^SELINUX=/c SELINX=disabled' /etc/selinux/conf
#给文件行加注释
sed -r '1,10s/^/#/' a.txt
sed -r '1,10s/(.*)/#\1/' a.txt
#sed中使用外部变量
#var1=11111
sed -r '1a$var1' passwd.txt
sed -r "1a$var1" passwd.txt
sed -r "$a$var1" /etc/hosts
#会报错
sed -r "\$a$var1" /etc/hosts
#双重否定
缓存区数据交换
-
首先需要明白, sed处理文件是逐行处理的, 即读取一行处理一行,输出一行;
-
sed把文件读出来每一行存放的空间叫模式空间, 会在该空间中对读到的内容做相应处理;
-
此外sed还有一个额外的空间即暂存空间, 暂存空间刚开始里边只有个空行, 记住这一点;
-
sed可使用相应的命令从模式空间往暂存空间放入内容或从暂存空间取内容放入模式空间;
缓存区sed程度命令
命令 | 含义 |
---|---|
h | 将模式空间里面的内容复制到暂存空间缓存区(覆盖方式) |
H | 将模式空间里面的内容复制到暂存空间缓存区(追加方式) |
g | 将暂存空间里面的内容复制到模式空间缓存区(覆盖方式) |
G | 将暂存空间里面的内容复制到模式空间缓存区(追加方式) |
x | 交换2个空间的内容 |
示例
#将模式空间第一行复制到暂存空间(覆盖方式),并将暂存空间的内容复制到模式空间中的最后一行(追加方式)
sed '1h;$G' 1.txt
# 1h 从模式空间中将第一行数据复制到暂存空间(覆盖方式)
# $G 将暂存空间中的内容复制到模式空间中最后一行(追加方式)
#第一行删除后粘贴到最后1行
sed '1{h;d};$G' 1.txt
# 1{h;d}对模式空间中的第一行数据同时进行复制到暂存空间(覆盖方式)和删除模式空间中的第一行数据
#第一行数据复制粘贴替换其他行数据
sed '1h;2,$g' 1.txt
#将模式空间第一行复制到暂存空间(覆盖方式), 最后将暂存空间的内容复制到模式空间中替换从第2行开始到最后一行的每一行数据(覆盖方式)
#将前3行数据数据复制粘贴到最后一行
sed '1,3h;$G' 1.txt