006 sed流编辑器
sed是一种在线的,非交互式的编辑器,它一次处理一行内容,默认打印
一、sed命令格式
sed [options] ‘[匹配模式] sed的内部命令’ file1 file2
options 参数,可选项
-r #支持扩展正则表达式
-n #屏蔽默认输出
-i #直接修改文件中的内容,而不是输出到屏幕
-f #直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作。
匹配模式 模式可以是正则,也可以是文件的行号
sed内部命令 ''
必须有,默认是打印
-p #打印
-a #追加,在文件尾部
sed -r '$a 1.1.1.1' /etc/hosts
-i #插入
sed -r '2i\1111111' /etc/hosts #在第二行之后插入
-c #修改
sed -r '2c\2222222' /etc/hosts #将第二行修改
-s #替换
sed -r 's/1/2/g' #g代表全局替换
注:
**sed和grep不一样
不管是否找到指定的模式,它的退出状态都是0
只有当命令存在语法错误时,sed的退出状态才是非0
**
二、搜索替换
> 搜索每一行,找到有root的,把第一个替换为shark
sed -rn 's/root/shark' mypasswd
> 搜索每一行,找到所有的root字符,进行全局替换
sed -rn 's/root/shark/g' mypasswd
> i 同时忽略大小写
sed -rn 's/root/shark/gi' mypasswd
> 找到含有root的进行删除
sed -rn '/root/d'
> 可以使用不同的 字符 作为界定符号,注意进行转义
sed -rn '\#root#d' mypasswd
> 注意:
> 当在模式匹配中使用其他界定符号时,需要对其进行转义。
> 其他界定符用在 `s` 搜索替换时不必转义
三、sed扩展(定址)
> 全部行删除 sed -r 'd' mypasswd
> 第 3 行删除 sed -r '3 d' mypasswd
> 第 1 行到第 3 行都删除 sed -r '1,3 d' mypasswd
> 从含有 root 字符串的行开始匹配,一直删除`到`第 5 行
sed -r '/root/,5 d' mypasswd
> 从含有 root 字符串的行开始匹配,并删除此行`之后`的 2 行
sed -r '/root/,+2 d' mypasswd
> 含有 root 的行不删除,其他的都删除
sed -r 'root !d' mypasswd
> 使用行号除以 2 ,余数是 1 的行删除
sed -r '1~2 d' mypasswd
> 使用行号除以 2, 余数 是 0 的 打印出来
sed -rn '0~2 p' mypasswd
四、sed的常见操作
删除配置文件中 # 号注释的行
sed -ri '/^#/d' file.conf
删除开头的一个或者多个 空格或者 Tab 键
sed -ri '/^[ \t]*#/d' file.conf
YUM 源修改
sudo sed -ri s/^#baseurl/baseurl/g /etc/yum.repos.d/CentOS-Base.repo
sudo sed -ri s/^mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOSBase.repo
空格和table键 '/^#/d' [ \t] * 空格和table
删除配置文件中//号注释行
sed -ri '\Y^[ \t]*//Yd' file.conf
删除无内容空行
- 开头和结尾之间什么都没有的行
- 开头和结尾之间有多个空格的行
- 开头和结尾之间有多个 Tab 键的行
sed -ri '/^[ \t]*$/d' file.conf
删除注释行及空行:
以下 3 中效果一样,挑一个自己喜欢的
sed -ri '/^[ \t]*#/d; /^[ \t]*$/d' /etc/vsftpd/vsftpd.conf
sed -ri '/^[ \t]*#|^[ \t]*$/d' /etc/vsftpd/vsftpd.conf
sed -ri '/^[ \t]*($|#)/d' /etc/vsftpd/vsftpd.conf
修改文件:
sed -ri '$a\chroot_local_user=YES' /etc/vsftpd/vsftpd.conf
sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
sed -ri '/UseDNS/cUseDNS no' /etc/ssh/sshd_config
sed -ri '/GSSAPIAuthentication/cGSSAPIAuthentication no' /etc/ssh/sshd_config
给文件行添加注释:
sed -r '2,6s/^/#/' a.txt
使用小括号进行分组,可以有多个分组, 后面可以使用 \1 获取到第一个分组的内容
sed -r '2,6s/(.*)/#\1/' a.txt
sed -r '2,6s/.*/#&/' a.txt &匹配前面查找的内容
sed -r '3,$ s/^#*/#/' a.txt 将行首零个或多个#换成一个#
sed -r '30,50s/^[ \t]*#*/#/' /etc/nginx.conf
sed -r '2,8s/^[ \t#]*/#/' /etc/nginx.conf
sed中使用外部变量
var1=11111
# 无效
sed -r '3a$var1' /etc/hosts
# 正确
sed -r "3a$var1" /etc/hosts
# 有效
sed -r 3a$var1 /etc/hosts
# 报错
sed -r "$a$var1" /etc/hosts
# 有效,但是中间不能有空格
sed -r '$a'"$var1" /etc/hosts
# 有效, 将第一个 $ 进行转义
sed -r "\$a $var1" /etc/hosts