shell使用-sed
概述
sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于Shell脚本中,用以完成各种自动化处理任务。
sed 的工作流程主要包括读取、执行和显示三个过程。
读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
sed 有两个内置的存储空间:
名称 概念
模式空间(pattern space) 模式空间用于 sed 执行的正常流程中。该空间 sed 内置的一个缓冲区,用来存放、修改从输入文件读取的内容。
保持空间 (hold space) 保持空间是另外一个缓冲区,用来存放临时数据。Sed 可以在保持空间和模式空间交换数据,但是不能在保持空间上执行普通的 sed 命令。
基本语法
通常情况下调用sed命令有两种格式,如下所示。其中,“参数”是指操作的目标文件,当存在多个操作对象时用,文件之间用逗号“,”分隔;而scriptfile表示脚本文件,需要用“-f”选项指定,当脚本文件出现在目标文件之前时,表示通过指定的脚本文件来处理输入的目标文件。
Sed[选项] '操作' 参数
sed [选项] -f scriptfile 参数
常见的 sed 命令选项
-e 或–expression=:表示用指定命令或者脚本来处理输入的文本文件。
-f 或–file=:表示用指定的脚本文件来处理输入的文本文件。
-h 或–help:显示帮助。
-n、–quiet 或 silent:表示仅显示处理后的结果。
-i:直接编辑文本文件。
常见的操作
“操作”用于指定对文件操作的动作行为,也就是 sed 的命令。通常情况下是采用的“[n1[,n2]]”操作参数的格式。n1、n2 是可选的,不一定会存在,代表选择进行操作的行数,如操作需要在 5~20 行之间进行,则表示为“5,20 动作行为”。常见的操作包括以下几种。
命令 说明
a\ 在当前行后添加一行或多行,注意是行而不是字符串
c\ 用新文本修改(替换)当前行中的文本
d 删除行
i\ 在当前行之前插入文本
h 把模式空间里的内容复制到暂存缓存区
H 把模式空间里的内容追加到暂存缓存区
g 取出暂存缓冲区里的内容,将其复制到模式空间,覆盖该处原有内容
G 取出暂存缓冲区里的内容,将其复制到模式空间,追加在原有内容后面
l 列出非打印字符
p 打印行
n 读入下一输入行,并从下一条命令而不是第一条命令开始处理
q 结束或退出 sed
r 从文件中读取输入行
! 对所选行意外的所有行应用命令
s 用一个字符串替换另一个
———————————————
基本使用:demo.txt文件如下
1、给该文件第四行下增加一行,内容是abcde,只展示处理后的结果
2、打印出第三行
不带 -i的都是在临时缓冲区处理,不会真的修改文件;
3、替换内容,第一行的wo替换为ni
4、最后一行替换,82替换为99
5、删除第三行
6、删除空白行
`//d`是`sed`命令的格式之一,它表示删除匹配的文本行。
`^\s*$`表示空行,这个正则表达式的意思是:以行首开头,跟随零或多个空格或Tab,然后是行尾结尾(也就是一行里只有空格或Tab)
7、替换某一行内容,第二行替换为olp
8、将1-4行中包含123的替换为455,不加/g,表示受影响的行只改命中的第一个123
参考:
# 只将第4行中hello替换为A
$ sed '4s/hello/A/g' file.txt
# 将第2-4行中hello替换为A
$ sed '2,4s/hello/A/g' file.txt
# 从第2行开始,往下数4行,也就是2-6行
$ sed '2,+4s/hello/A/g' file.txt
# 将最后1行中hello替换为A
$ sed '$s/hello/A/g' file.txt
# 除了第1行,其它行将hello替换为A
$ sed '1!s/hello/A/g' file.txt
结合正则表达式练习
1. 删除文件每行的第二个字符
$ sed -r 's/(.)(.)(.*)$/\1\3/' file.txt
2. 交换每行的第一个字符和第二个字符
$ sed -r ‘s/(.)(.)(.*)/\2\1\3/’ file.txt
3. 删除文件中所有的数字
$ sed 's/[0-9]//g' file.txt
4. 用制表符替换文件中出现的所有空格
$ sed -r 's/ +/\t/g' file.txt
5. 把所有大写字母用括号()括起来
$ sed -r 's/([A-Z])/(\1)/g'
6. 隔行删除
$ sed '0~2{d}' file.txt
7. 删除所有空白行
$ sed '/^$/d' file.txt
ps:再解释下/g的说明,看下如下的两个操作的不同
结合一开始的讲述,sed是行处理模式,不加/g,则处理每行第一个匹配到的字符串,之后进入到下一行
+g :匹配每一行有行首到行尾的所有字符
不加g:匹配每一行的行首开始匹配,匹配到第一个符合的字段,就会结束,跳到下一行
参考:https://baijiahao.baidu.com/s?id=1689910932204845127&wfr=spider&for=pc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?