sed工具详解
目录
sed工具概述
sed 命令常见用法
用法示例
sed工具概述
文本处理器
在Linux/UNIX系统中包含很多种类的文本处理器或文本编辑器,其中包括我们之前学习过的VIM编辑器与grep等。而 grep,sed,awk 更是shell 编程中经常用到的文本处理工具,被称之为Shell编程三剑客
sed工具
sed (stream
EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于Shell脚本中,用以完成各种自动化处理任务。
sed 的工作流程主要包括读取、执行和显示三个过程。
读取:sed
从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,patternspace) 。
执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed
命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
sed 命令常见用法
通常情况下调用sed 命令有两种格式,如下所示。其中,"参数"是指操作的目标文件,
当存在多个操作对象时用,文件之间用逗号","分隔;而scriptfile表示脚本文件,需要用"-f"
选项指定,当脚本文件出现在目标文件之前时,表示通过指定的脚本文件来处理输入的目标文件。
sed[选项]'操作'参数
sed[选项]-f scrliptfile参数
常见的sed命令选项主要包含以下几种。
-e 或--expression=:表示用指定命令或者脚本来处理输入的文本文件。
-f 或--file=:表示用指定的脚本文件来处理输入的文本文件。
-h或--help:显示帮助。
-n、 --quiet或silent:表示仅显示处理后的结果。
-i.bak:直接编辑文本文件。
-r,-E使用扩展正则表达式
-s将多个文件视为独立文件,而不是单个连续的长文件流
"操作"用于指定对文件操作的动作行为,也就是sed
的命令。通常情况下是采用的"[n1[,n2]]“操作参数的格式。n1、n2
是可选的,代表选择进行操作的行数,如操作需要在5~20行之间进行,则表示为"5,20动作行为”。常见的操作包括以下几种。
a:增加,在当前行下面增加一行指定内容。
c:替换,将选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用。
s:替换,替换指定字符。
y:字符转换。
用法示例
在本小节中依旧以 11.txt文件为例进行演示。
(1)输出符合条件的文本(p表示正常输出)(搜索)
sed -n 'p' 11.txt //输出的内容,等同于 cat 11.txt
在执行"sed -n '10,${n;p}'11.txt"命令时,读取的第1行是文件的第10 行,读取的第2行是文件的第11行,依此类推,所以输出的偶数行是文件的第11行、13行直至文件结尾,其中包括空行。
ifconfig ens33 | sed -n 2p#直接显示第二行内容
以上是sed 命令的基本用法,sed命令结合正则表达式时,格式略有不同,正则表达式以"/"包围。例如,以下操作是 sed命令与正则表达式结合使用的示例。
(2)删除符合条件的文本(d)
因为后面的示例还需要使用测试文件11.txt,所以在执行删除操作之前需要先将测试文件备份。以下示例分别演示了sed命令的几种常用册删除用法。
下面命令中 nl命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果。
案例:
nl 11.txt | sed '8d' ##删除第8行
nl 11.txt | sed '1,9d' ##删除1-9行
nl 11.txt | sed '/the/d' ##删除包含the的行
nl 11.txt | sed '/the/!d' ##!取反 删除没有the的行
sed '/^[a-z]/d' 11.txt ##删除以a-z所有小写字母开头的行
sed '/\.$/d' 11.txt ##删除以“.”结尾的行
sed '/^$/d' 11.txt ##删除所有空行的行
注意︰若是删除重复的空行﹐即连续的空行只保留一个,"cat -s test.txt"。
(3)替换符合条件的文本
在使用sed命令进行替换操作时需要用到s(字符串替换)、c(整行/整块替换)、y(字符转换)命令选项,常见的用法如下所示。
案例:
sed 's/the/THE/' 11.txt ##将每行的第一个the替换成THE
sed 's/l/L/1' 11.txt ##将每行的第二个l替换成L
sed 's/the/THE/g' 11.txt ##将全文中所有the 替换成THE
sed 's/o/ /g' 11.txt ## 将全文所有o 删除(替换成空串)
sed 's/^/#/' 11.txt ##在每行行首插入#号
sed 's/$/EOF/' 11.txt ##在每行行尾插入EOF
sed '3,5s/the/THE/g' 11.txt ##将3-5行中所有the替换成THE
sed '/the/s/o/O/g' 11.txt ##将包含the的所有行中的o替换成O
sed '/the/s/^/#/' 11.txt ##在包括the的每行行首插入#号
sed 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
(4)迁移符合条件的文本
在使用sed命令迁移符合条件的文本时,常用到以下参数.
H:复制到剪贴板;
g、G:将剪贴板中的数据覆盖/追加至指定行;
w:保存为文件;
r:读取指定文件;
a:追力加指定内容。具体操作方法如下所示。
l, i忽略大小写
案例:
sed '/the/{H;d};$G' 11.txt ##将包含the的行迁移到文件末尾,{;}用于多个操作
sed '1,5{H;d};15G' 11.txt ##将1-5行内容转移至15行后
sed '/the/w out.file' 11.txt ##将包含the 的行另存为文件out.file
sed '/the/r /etc/hostname' 11.txt ##将文件/etc/hostname 的内容添加到包含the的每行之后
sed '3aNEW' 11.txt ##在第3行后插入一个新行,内容为NEW
sed '/the/aNEW' 11.txt ##在包含the的每行后插入一个新行,内容为NEW
sed '3aNEW1\nNEW2' 11.txt ##在第3行后插入多行内容,中间的\n表示换行
(5)使用脚本编辑文件
使用sed脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过"-f"选项来调用。例如执行以下命令即可将第1~5行内容转移至第16行后。
sed '1,5{H;d};16G' 11.txt ##将1-5行内容转移至16行后
vim open.list
1,5H
1,5d
16G
sed -f open.list 11.txt
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律