一、sed的概述
1.1、什么是sed
sed 命令是利用脚本来处理文本文件。它可以依照脚本的指令来处理、编辑文本文件。主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
1.2、sed原理
1.从指定的操作指令中取出第一条指令,判断是否匹配pattern;
2.如果不匹配,则忽略后续的编辑命令,回到第2步继续取出下一条指令;
3.如果匹配,则针对缓存的行执行后续的编辑命令;完成后,回到第2步继续取出下一条指令;
4.当所有指令都应用之后,输出缓存行的内容;回到第1步继续读入下一行内容;
5.当所有行都处理完之后,结束。
二、sed的常用操作选项
sed [选项] '操作' 参数
sed [选项] -f scriptfile 参数
选项 含义
-e 进行多次编辑
-n 取消默认输出
-f 指定sed文件名
-i 直接在源文件中修改
-r 使用扩展正则表达式
sed常用命令动作
命令动作 含义
p 打印输出
d 删除指定行
i 在指定行之前插入内容
a 在指定行后面插入内容
c 替换指定行所有内容
s 搜索替换
y:字符转换。
总结:sed命令+选项 ‘定位+动作+内容’ 文件名
三、sed的具体操作
3.1、打印输出
例1、查看文件内容
例2、 #带有自动打印功能,p又再打印一遍
例3、-n 选项关闭自动打印功能
例4、如何显示范围 行号,行号
例5、奇数偶数表示
#从第二行开始,2选择每隔两行的行,p并打印出来
例6、 一些结合用法
3.2、增加内容
例1、表示操作发生在第二行,i: 表示插入操作,即在指定的行之前插入文本hello world
例2、表示操作发生在第二行,a在当前行下面增加一行
例3、结合使用
3.3、删除
3.4、替换
替换修饰符:g 行内全局替换p 显示替换成功的行w /PATH/FILE 将替换成功的行保存至文件中I,i 忽略大小写
例1、这里没有真的改变文件内容,只是输出到屏幕
例2、要真的替换,需要用-i选项,建议用-i之前对原文件进行备份
3.5、搜索替换
c 指令使得整行内容全部替换, d 指令删除整行,如果要只替换某个关键词的话需要使用 s 指令格式: sed 选项 ‘s/ 搜索的内容 / 替换的内容 / 动作 ’
例1、搜索root所在行把第一个出现的root换成ROOT
![](https://i-blog.csdnimg.cn/direct/864283ad52f84091a1901b97d6a558ab.png)
例2、搜索root所在行,把所有出现的root都替换成ROOT
例3、搜索字母o,仅替换每行第二个o为大写O
例4、将root替换为空
例5、把1-5行的开头都插入#号
例6、忽略大小写的替换
3.6、插入文件
例1、匹配第几行后插入文本内容
例2、查询字符后插入文本内容
3.7、另存为到文件
例1、
3.8、同时编辑
例、#表示用指定命令或者脚本来处理打印第一行和第三行
3.9、分组操作
3.10、读取完退出
3.11、sed脚本
使用 sed 脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过“-f”选项来调用
注意:以上除了查看固定多少行的内容,其他所有的操作加上"-i"选项,才能真正的对文本进行编辑,不然只能看到操作后的结果,并不能直接对文本能让修改。
四、扩展
4.1、sed的高级应用
1、-r匹配正则
2、结合变量使用
3、保留空间的使用
#不用也可以#但是如果遇到想在最后一行后面添加的话 就不能用双引号或者不用符号#如果要用双引号必须用转义符
4.2、操作实例
####sed 直接操作文件示例
生产案列
案列 1
需求:需要将ens33网络接口的IP地址修改为 192.168.10.100
sed -i 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/networkscripts/ifcfg-ens33
案列 2
需求:需要将 Apache 的监听地址修改为 192.168.10.100,端口修改为 8080
# 修改监听地址
sudo sed -i 's/^Listen .*/Listen 192.168.10.100:8080/'
/etc/httpd/conf/httpd.conf
# 修改 ServerName
sed -i 's/^ServerName .*/ServerName 192.168.10.100:8080/'
/etc/httpd/conf/httpd.conf
编写一个脚本,用来调整 vsftpd 服务配置,要求禁止匿名用户,但允许本地用户(也允许写入)。
案列3 脚本
[root@lo calhost ~]# vim local_only_ftp.sh
#!/bin/bash
# 指定样本文件路径、配置文件路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf "
CONFIG="/etc/vsftpd/vsftpd.conf"
# 备份原来的在, 若不存在则使用 cp 命令进行配置文件,检测文件名为/etc/vsftpd/vsftpd.conf.bak
备份文件是否存文件备份
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak # 基于样本配置进行调整,覆盖现有文件
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG
grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG
# 启动vsftpd 服务,并设为开机后自动运行
systemctl restart vsftpd
systemctl enable vsftpd
[root@localhost ~]# chmod +x local_only_ftp.sh