sed
(stream editor, 流编辑器) 是Linux下一款功能强大的非交互流式文本编辑器(vim是交互式文本编辑器),可以对文本文件的每一行数据匹配查询之后进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑。
sed是一种流编辑器,它一次处理一行内容,将这行放入缓存(存区空间称为:模式空间),然后才对这行进行处理,处理完后,将缓存区的内容发送到终端。
sed会读取每一行数据到模式空间中,之后判断当前行是否符合模式匹配要求,符合要求就会执行sed程序命令,否则不会执行sed程序命令;如果不写匹配模式,那么每一行都会执行sed程序命令。
sed [选项参数] [模式匹配/sed程序命令] [文件名]
选项参数说明:
选项参数 | 功能 |
---|---|
-e | 直接在指令列模式上进行sed的动作编辑。它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项;一行命令语句可以执行多条sed命令。 |
-i | 直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改。 |
-f | 后跟保存了sed指令的文件。 |
-n | 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行。 |
-r ruguler | 使用扩展正则表达式,默认情况sed只识别基本正则表达式 *。 |
sed程序命令功能描述:
命令 | 功能描述 |
---|---|
a | add新增,a的后面可以接字串,在下一行出现。 |
c | change更改,更改匹配行的内容。 |
d | delete删除,删除匹配的内容。 |
i | insert插入,向匹配行前插入内容。 |
p | print打印,打印出匹配的内容,通常与-n选项合用。 |
s | substitute替换,替换掉匹配的内容。 |
= | 用来打印被匹配的行的行号。 |
n | 读取下一行,遇到n时会自动跳入下一行。 |
特殊符号:
命令 | 功能描述 |
---|---|
! | 就像一个sed命令,放在限制条件后面,对指定行以外的所有行应用命令(取反)。 |
{sed命令1;sed命令2} | 多个命令操作同一个的行。 |
准备测试文件sed.txt内容:
ABC
itheima itheima
itcast
123
itheima
向第三行后面添加hello:
sed '3ahello' sed.txt
#3 代表第三行
#a 代表在后面添加, 出现在下一行
#注意这里没有修改源文件
运行效果
向第三行前面添加hello:
sed '3ahello' sed.txt
#3 代表第三行
#a 代表在后面添加, 出现在下一行
#注意这里没有修改源文件
运行效果
向内容 itheima
后面添加 hello
,如果文件中有多行包括 itheima
,则每一行后面都会添加:
sed '/itheima/ahello' sed.txt
运行效果
向内容 itheima
前面添加 hello
,如果文件中有多行包括 `itheima
`,则每一行前面都会添加:
sed '/itheima/ihello' sed.txt
运行效果
在最后一行后面添加hello
:
sed '$ahello' sed.txt # $a 最后一行后面添加
运行效果
在最后一行前面添加hello
sed '$ihello' sed.txt # $i 最后一行前面添加
运行效果
删除第2行数据:
sed '2d' sed.txt
# d 用于删除
# 2d 删除第2行
运行效果
删除第1行和第4行数据:
sed '1d;4d' sed.txt
运行效果
从第一行开始删除,每隔2行就删掉一行:
sed '1~2d' sed.txt # 1~2 从第1行开始, 每隔2行删除
运行效果
删除从第1行到第3行的数据:
sed '1,3d' sed.txt # 1,3 从指定第1行开始到第3行结束
运行效果
删除从第1行到第3行取反的数据:
sed '1,3!d' sed.txt # 1,3! 从指定第1行开始到第3行结束取反, 就是除了第1行到第3行,其他行都删除
运行效果
sed '$d' sed.txt
运行效果
sed '/itheima/d' sed.txt
运行效果
删除匹配itheima的行一直到最后一行:
sed '/itheima/,$d' sed.txt #, 代表范围匹配
运行效果
删除匹配itheima行及其后面一行
sed '/itheima/,+1d' sed.txt
运行效果
删除不匹配 itheima
或 itcast
的行
sed '/itheima\|itcast/!d' sed.txt
# \| 是正则表达式的或者 这里|需要转义, 所以为\|
# ! 取反
运行效果
sed '1chello' sed.txt
运行效果
sed '/itheima/chello' sed.txt
运行效果
sed '$chello' sed.txt
运行效果
将文件中的itheima替换为hello,默认只替换每行第一个itheima:
sed 's/itheima/hello/' sed.txt
运行效果
注意
's/itheima/hello/'
最后一个/
不可少
将文本中所有的itheima都替换为hello,全局替换:
sed 's/itheima/hello/g' sed.txt # g 代表匹配全局所有符合的字符
将每行中第二个匹配的itheima替换为hello:
sed 's/itheima/hello/2' sex.txt
运行效果
将每行中第二个匹配的itheima替换为hello , 将替换后的内容写入到sed2.txt文件中
# 第一种方式
sed -n 's/itheima/hello/2pw sed2.txt' sed.txt
# w写入
# p打印, -n只是获取
# 第二种方式
sed -n 's/itheima/hello/2p ' sed.txt > sed2.txt
运行效果
匹配有 i
的行,替换匹配行中 t
后的所有内容为空字符串:
sed '/i/s/t.*//g' sed.txt
运行效果
sed 's/$/& test' sed.txt # & 用于拼接
运行效果
#
sed 's/^/#/' sed.txt
运行效果
sed -n '/itcast/p' sed.txt
运行效果
管道查询所有进程中含有sshd
的进程信息:
ps -aux | sed -n '/sshd/p'
运行效果
将sed.txt文件中的第1行删除并将 itheima
替换为 itcast
# 第一种方式, 多个sed程序命令 在每个命令之前使用 -e 参数
sed -e '1d' -e 's/itheima/itcast/g' sed.txt
# 第二种方式,用分号隔开命令
sed '1d;s/itheima/itcast/g' sed.txt
运行效果
模式空间与暂存空间:
缓存区sed程序命令:
命令 | 含义 |
---|---|
h | 将模式空间里面的内容复制到暂存空间缓存区(覆盖方式) |
H | 将模式空间里面的内容复制到暂存空间缓存区(追加方式) |
g | 将暂存空间里面的内容复制到模式空间缓存区(覆盖方式) |
G | 将暂存空间里面的内容复制到模式空间缓存区(追加方式) |
x | 交换2个空间的内容 |
将模式空间第一行复制到暂存空间(覆盖方式),并将暂存空间的内容复制到模式空间中的最后一行(追加方式)
sed '1h;$G' sed.txt
# 1h 从模式空间中将第一行数据复制到暂存空间(覆盖方式)
# $G 将暂存空间中的内容复制到模式空间中最后一行(追加方式)
运行效果
将模式空间第一行复制到暂存空间(覆盖方式)并删除,最后将暂存空间的内容复制到模式空间中的最后一行(追加方式)
sed '1{h;d};$G' sed.txt
# 1{h;d}对模式空间中的第一行数据同时进行复制到暂存空间(覆盖方式)和删除模式空间中的第一行数据
运行效果
将模式空间第一行复制到暂存空间(覆盖方式),最后将暂存空间的内容复制到模式空间中替换从第2行开始到最后一行的每一行数据(覆盖方式)
sed '1h;2,$g' sed.txt
运行命令
将前3行数据复制到暂存空间(追加方式),之后将暂存空间的所有内容复制粘贴到模式空间最后一行(追加方式)
sed '1,3H;$G' sed.txt
运行效果
插入空行
sed G -i sed.txt
# G 每行后面添加一个空行
# -i 修改源文件
运行效果
sed -i '/^$/d' sed.txt
运行效果