sed详解
1. 概述
今天单独拉出一章来讲述下
sed
命令。因为sed
命令确实内容太多,不过也是比较灵活的,好了不废话了。我们开始吧
1.2 原理解析
shell脚本虽然功能很多,但是它最常用的功能还是处理文本文件,尤其是在正常的业务操作流程场景中,比如检查日志文件、读取配置、处理数据等现象,虽然我们能够使用echo、cat、<<、>>、|等符号实现文件内容的操作,但是整个过程有些繁琐。所以我们需要一种更为轻便的文本编辑工具,sed就是其中的一种。
简介
2. 基本格式
2.1 轮廓格式
基本格式
sed [参数] '<匹配条件> [动作]' [文件名]
注意:
匹配条件和动作两侧有'
动作可以有多个,彼此间使用;隔开,比如 '2p;4p'
2.2 参数
参数详解:
参数为空 表示sed的操作效果,实际上不对文件进行编辑,缓存区所有信息都显示
-n 不输出模式空间内容到屏幕,即不自动打印所有内容
-e 基于命令实现对文件的多点编辑操作
-f 从指定文件中读取编辑文件的”匹配条件+动作”
-r 支持使用扩展正则表达式
-i.bak 复制文件原内容到备份文件,然后对原文件编辑
-i 表示对文件进行编辑
注意:
mac版本的bash中使用 -i参数,必须在后面单独加个东西: -i ''
-i -r 支持 -ri 支持
-ir 不支持
-ni 危险选项,会清空文件
2.3 行数匹配
匹配条件分为两种:数字行号或者关键字匹配
数字行号:
空 表示所有行 n 表示第n行 $ 表示末尾行
n,m 表示第n到m行内容 n,+m 表示第n到n+m行
~步进 1~2 表示奇数行 2~2 表示偶数行
关键字匹配格式:
'/关键字/'
注意:
隔离符号 / 可以更换成 @、#、!等符号
根据情况使用,如果关键字和隔离符号有冲突,就更换成其他的符号即可。
/关键字1/,/关键字2/ 表示关键字1所在行到关键字2所在行之间的内容
n,/关键字2/ 表示从第n行到关键字2所在行之间的内容
2.4 动作详解
动作详解
-a[\text] 在匹配到的内容下一行增加内容,支持\n实现多行追加
-i[\text] 在匹配到的内容当前行增加内容
-c[\text] 在匹配到的内容替换内容
-d|p 删除|打印匹配到的内容
-s 替换匹配到的内容
W /path/somefile 保存模式匹配的行至指定文件
r /path/somefile 读取指定文件的文本至模式空间中
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
注意:
上面的动作应该在参数为-i的时候使用,不然的话不会有效果
3. 参数【n
】使用详解
不输出模式空间内容到屏幕,即不自动打印所有内容.
3.1 打印指定行数
[root@VM-8-3-centos 20230227]# sed -n '2p' sed.txt
nihao sed4 sed5 sed6
[root@VM-8-3-centos 20230227]#
3.2 过滤IP段 所在行
[root@VM-8-3-centos 20230227]# ifconfig eth0 | sed -n '2p'
inet 10.0.8.3 netmask 255.255.252.0 broadcast 10.0.11.255
[root@VM-8-3-centos 20230227]#
3.3 正则匹配到内容
[root@VM-8-3-centos 20230227]# sed -n '/sed4/p' sed.txt
nihao sed4 sed5 sed6
[root@VM-8-3-centos 20230227]#
3.4 输出奇数行
[root@VM-8-3-centos 20230227]# sed -n '1~2p' sed.txt
nihao sed1 sed2 sed3
nihao sed7 sed8 sed9
3.5 输出偶数行
[root@VM-8-3-centos 20230227]# sed -n '0~2p' sed.txt
nihao sed4 sed5 sed6
nihao sed10 sed11 sed12
3.6 实现多点输出
[root@VM-8-3-centos 20230227]# sed -n -e '1p' -e '3p' sed.txt
nihao sed1 sed2 sed3
nihao sed7 sed8 sed9
[root@VM-8-3-centos 20230227]#
4. 符号【s】详解(内容替换)
4.1 基本格式
命令格式:
sed -i [替换格式] [文件名]
源数据 | sed -i [替换格式]
注意:替换命令的写法
's###' ---> 's#原内容##' ---> 's#原内容#替换后内容#'
隔离符号 / 可以更换成 @、#、!等符号
4.2 表现形式
表现样式:
样式一:替换指定匹配的内容
sed -i '行号s#原内容#替换后内容#列号' [文件名]
echo "源数据" | sed -i '行号s#原内容#替换后内容#列号'
样式二:替换所有的内容
sed -i 's#原内容#替换后内容#g' [文件名]
echo "源数据" | sed -i '行号s#原内容#替换后内容#g'
样式三: 替换指定的内容
sed -i '行号s#原内容#&新增信息#列号' [文件名]
- 这里的&符号代表源内容,实现的效果是 '原内容+新内容'
4.3 综合案例
4.3.1 替换单个
sed -i "s#sed#SED#" sed.txt
4.3.2. 替换全部
sed -i "s#sed#SED#g" sed.txt
4.3.3 指定行号,内容替换
sed -i "2s#sed#SED" sed.txt
4.3.4 指定列号,内容替换
sed -i "s#sed#SED#2" sed.txt
5. 符号【a\】增加操作
5.1 基本格式
作用:
在指定行号的下一行增加内容
格式:
sed -i '行号a\增加的内容' 文件名
注意:
如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如
sed -i '1,3a\增加内容' 文件名
5.2 综合实践
5.2.1 单行添加
sed -i '2a\ceshi-2' sed.txt
5.2.2 多行增加
sed -i '1,3a\ceshi--' sed.txt
6. 插入操作
6.1 基本格式
作用:
在指定行号的当行增加内容
格式:
sed -i '行号i\增加的内容' 文件名
注意:
如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如
sed -i '1,3i\增加内容' 文件名
6.2 综合案例
6.2.1 多行插入
sed -i '1,2i\ceshi--' sed.txt
7. 删除操作
7.1 基本格式
作用:
指定行号删除
格式:
sed -i '行号d' 文件名
注意:
如果删除多行,可以在行号位置多写几个行号,彼此间使用逗号隔开,例如
sed -i '1,3d' 文件名
7.2 综合实践
sed -i '1,2d' sed.txt
8. 进阶匹配
8.1 基本格式
内容匹配:
'/关键字内容/'
注意:
隔离符号 / 可以更换成 @、#、!等符号
根据情况使用,如果关键字和隔离符号有冲突,就更换成其他的符号即可。
/关键字1/,/关键字2/ 表示关键字1所在行到关键字2所在行之间的内容
n,/关键字2/ 表示从第n行到关键字2所在行之间的内容
/关键字1/,n, 表示从关键字1所在行到第n行之间的内容
/关键字1/,+n, 表示从关键字1所在行到(所在行+n行)之间的内容
8.2 综合示例
查看匹配的内容
多行信息匹配
匹配内容到第6行内容
第一个行到匹配的内容
匹配内容以及下面3行的内容
9. 修改实践
过滤#开头,以及空行
sed '/^$/d;/^#/d' nginx.conf
过滤#开头,以及空行。 同时进行备份
sed -i.bak '/^#/d;/^$/d' nginx.conf
借助& 进行内容替换扩充
head -n 1 /etc/passwd | sed -n 's/root/&user/gp'