shell 006 __ 小斌文档 | sed

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值