Sed命令的使用小结

Posted 码农飞哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sed命令的使用小结相关的知识,希望对你有一定的参考价值。

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
❤️ 2. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
😁 5. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
全网同名【码农飞哥】欢迎关注,个人VX: wei158556

文章目录

1. 简介

上一篇文章我们介绍了Shell 脚本的编写总结,这篇文章单独介绍另一个使用频率比较高的命令:sed命令

2. sed的概念

sed(Stream Editor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等)。最后输出所有行或者仅输出处理的某些行,sed可以在无交互的情况下实现比较复杂的文本处理操作,被广泛应用于shell脚本,用以完成各种自动化处理任务。
sed的工作流程主要包括读取、执行和显示三个过程。
读取:sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
执行:默认情况下,所有的sed命令都是在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

sed命令有三个特性:

  1. 非交互式:处理文件时,把当前处理的行存储到临时缓冲区(又称模式空间,pattern space),即它是基于模式
  2. 逐行处理:sed命令在缓冲区中一次处理一行内容,处理完成之后,把缓冲区的内容送往屏幕,接着处理下一行,直到文件末尾。
  3. 正常情况下,sed命令所做的处理只是把操作结果(包括打印、删除等)输出到当前终端屏幕,**而并不会对原始文件做任何更改。**若希望直接修改文件内容,应添加选项 -i 。为了避免生产环境中因误操作导致系统故障,使用时要谨慎。

3. sed的图示

sed的数据流向图如下图所示:

4. sed命令的格式

sed命令的格式有两种:

  1. 格式一 :前置命令|sed [选项] ‘[定位符]处理动作’ [input-file]
    sed命令可以与其他命令组合使用,将前置命令和sed命令通过| 组合使用。
  2. 格式二:sed [选项] ‘[定位符]处理动作’ 文件 [input-file]
    其中,处理动作可以由-e指定多个处理动作,input-file为输入文件,可以指定多个。
    如果忘记了命令格式,可以执行 sed --help 命令进行查看

    下面就sed命令的语法进行一下介绍:

4.1. 选项说明

选项是非必选的,就是说可以为空

选项说明
-n安静模式,取消自动打印模式空间
-e脚本,添加"脚本" 到程序的运行列表
-f脚本文件,添加"脚本文件"到程序的运行列表
-i直接编辑原始文件
-r启动扩展的正则表达式,若与其他选项
-s将输入文件视为各个独立的文件而不是一个长的连续输入

4.2. 动作说明

[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后的老文本替换成新文本

5. 举例说明

原始文本:

5.1. 输出文本

5.1.1. 输出所有文本

sed -n 'p' sedtest.txt

5.1.2. 输出某一行

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

5.1.3. 利用正则表达式输出

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

5.1.4 输出奇偶数行

#输出奇数行
sed -n '1~2p' sedtest.txt
#输出偶数行
sed -n '2~2p' sedtest.txt

6. 删除文本

#删除所有行
sed -i 'd' sedtest-bak.txt
#删除第4行
sed -i '4d' sedtest-bak.txt

7. 替换文本

#将每行中第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

8. 行前行后插入文本

8.1. 行前插入文本

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

8.1. 行后插入文本

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

参考

sed命令详解+示例

以上是关于Sed命令的使用小结的主要内容,如果未能解决你的问题,请参考以下文章

Sed命令的使用小结

知识点小结~3

sed-awk命令详解

awk命令之小结1

sed小结

sed小结