您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
❤️ 2. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
😁 5. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
全网同名【码农飞哥】欢迎关注,个人VX: wei158556
上一篇文章我们介绍了Shell 脚本的编写总结,这篇文章单独介绍另一个使用频率比较高的命令:sed命令。
sed(Stream Editor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等)。最后输出所有行或者仅输出处理的某些行,sed可以在无交互的情况下实现比较复杂的文本处理操作,被广泛应用于shell脚本,用以完成各种自动化处理任务。
sed的工作流程主要包括读取、执行和显示三个过程。
读取:sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
执行:默认情况下,所有的sed命令都是在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
sed命令有三个特性:
sed的数据流向图如下图所示:

sed命令的格式有两种:
| 组合使用。sed --help 命令进行查看
选项是非必选的,就是说可以为空
| 选项 | 说明 |
|---|---|
| -n | 安静模式,取消自动打印模式空间 |
| -e | 脚本,添加"脚本" 到程序的运行列表 |
| -f | 脚本文件,添加"脚本文件"到程序的运行列表 |
| -i | 直接编辑原始文件 |
| -r | 启动扩展的正则表达式,若与其他选项 |
| -s | 将输入文件视为各个独立的文件而不是一个长的连续输入 |
[n1[,n2]] function
其中:[n1[,n2]] 称为定位符,用来定义需要操作的文本,如指定处理的起、止行数。
n1,n2不见得会存在,一般代表"选择进行动作的行数",举例来说,如果我的动作需要从2行号10行之间进行,则写作"2,4动作行为"。例如:
sed -n "2,4p" sedtest.txt

地址可表示为文本的"行号",或者用来匹配的"/正则表达式/",例如:
sed -n "/码农飞哥/p" sedtest.txt

省略定位符时,默认逐行处理全部文本。
function 为编辑指令,可以为增删改查等指令
| function | 说明 |
|---|---|
| a | 新增(append),a的后面可以接字符串,而这些字符串会在新的一行出现,(当前行后面添加一行文本) |
| c | 取代(change),c的后面可以接字符串,这些字符串可以取代n1,n2之间的行 |
| d | 删除(delete),后面不需要接任何字符串 |
| i | 插入(insert),行前插入文本,i的后面可以接字符串,而这些字符串会在新的一行出现(在当前行的上面插入一行) |
| p | 打印(print),行前插入文本,i的后面可以接字符串,而这些字符串会在新的一行出现(在当前行的上面插入一行) |
| s | 字符串替换(substitution),将s后的老文本替换成新文本 |
原始文本:

sed -n 'p' sedtest.txt

#输出第4行
sed -n '4p' sedtest.txt
#输出最后一行
sed -n '$p' sedtest.txt
#输出第2行到最后一行
sed -n '2,$p' sedtest.txt

#查询包含Python的文本
sed -n '/Python/p' sedtest.txt
#查询以“应有尽有” 结尾的文本
sed -n '/应有尽有$/p' sedtest.txt

#输出奇数行
sed -n '1~2p' sedtest.txt
#输出偶数行
sed -n '2~2p' sedtest.txt
#删除所有行
sed -i 'd' sedtest-bak.txt
#删除第4行
sed -i '4d' sedtest-bak.txt

#将每行中第1个Python替换成PYTHON
sed -i 's/Python/PYTHON/' sedtest-bak.txt
#将所有的的Java替换成 JAVA
sed -i 's/Java/JAVA/g' sedtest-bak.txt
#将第2行的PYTHON替换成 python
sed -i '2s/PYTHON/python/2' sedtest-bak.txt

#在第2行前插入单行文本
sed -i '2i 码农飞哥最棒' sedtest-bak.txt
#在 2. PYTHON爬虫专栏 前插入多行文本
sed -i '/2. PYTHON爬虫专栏/i\码农飞哥加油\n码农飞哥一定能成功' sedtest-bak.txt


#在第2行后插入单行文本
sed -i '2a feige最棒' sedtest-bak.txt
#在 JAVA高并发编程入门 前插入多行文本
sed -i '/JAVA高并发编程入门/a\feige加油\nfeige一定能成功' sedtest-bak.txt
