文本三剑客之sed

一、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、奇数偶数表示

#1 从第一行开始, 2 选择每隔两行的行, p 并打印出来

 #从第二行开始,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

例2、搜索root所在行,把所有出现的root都替换成ROOT

例3、搜索字母o,仅替换每行第二个o为大写O

例4、root替换为空

例5、1-5行的开头都插入#

例6、忽略大小写的替换

3.6、插入文件

例1、匹配第几行后插入文本内容

例2、查询字符后插入文本内容

3.7、另存为到文件

使用 w 指令将当前编辑的文件内容另存到其他文件中,如果目标文件已存在,则会将目标文件的内容覆 盖。

例1、

如果 /tmp/hosts 文件不存在,sed 命令会创建它;如果存在,sed 将会覆盖该文件的内容。
如果你想将 /etc/hosts 文件的内容追加到 /tmp/hosts 文件末尾,可以使用 >> 符号来实现,如
sed 'w /tmp/hosts' /etc/hosts >> /tmp/hosts。

3.8、同时编辑

sed支持一个或多个-e参数

例、#表示用指定命令或者脚本来处理打印第一行和第三行

3.9、分组操作

当我们需要对一行数据进行多次操作的时候我们可以使用 {} 进行分组

3.10、读取完退出

正常情况下 sed 会在读取完所有数据行之后退出,但是我们可以随时使用 q 指令来提前退出 sed

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值