一、基本概念
sed(Stream Editor)是Linux中一款流式文本编辑器,以非交互方式逐行处理文本数据。其核心原理是模式空间(临时缓冲区),每次读取一行内容到模式空间,通过编辑命令处理后输出结果,最后清空缓冲区并处理下一行。默认情况下,sed不会直接修改源文件,而是输出到屏幕。
二、语法结构
sed [选项] '编辑命令' 输入文件
sed [选项] -f 脚本文件 输入文件
示例:
sed -n '1,5p' file.txt
:打印文件第1到5行。sed -i.bak 's/old/new/g' file.txt
:直接修改文件并备份原文件为file.txt.bak
。
三、常用选项
选项 | 说明 |
---|---|
-n | 禁止默认输出,仅显示处理后的行(常与p 命令联用) |
-e | 指定多个编辑命令(如sed -e 's/a/A/' -e 's/b/B/' ) |
-i | 直接修改源文件(危险操作,建议先备份) |
-r | 启用扩展正则表达式(如支持+ 、? 等元字符) |
-f | 从脚本文件读取编辑命令(适合复杂操作) |
四、核心编辑命令
-
增删改操作
- 追加
a\text
:在匹配行后添加文本
示例:sed '/test/a\-->追加内容' file.txt
。 - 插入
i\text
:在匹配行前插入文本
示例:sed '3i\插入到第3行前' file.txt
。 - 替换整行
c\text
:替换匹配行内容
示例:sed '/error/c\修复后的内容' file.txt
。 - 删除行
d
:删除匹配行
示例:sed '/^#/d' file.txt
(删除所有注释行)。
- 追加
-
文本替换
s/pattern/replacement/[flags]
- 基本替换:
sed 's/old/new/'
(仅替换每行第一个匹配)。 - 全局替换:
sed 's/old/new/g'
(替换所有匹配)。 - 标记扩展:
p
:仅打印替换成功的行(需搭配-n
)
示例:sed -n 's/error/OK/p' log.txt
。w file
:将替换结果写入文件
示例:sed 's/error/OK/w output.txt' log.txt
。
- 基本替换:
-
高级操作
- 模式空间与保持空间:
h
/H
:将模式空间内容复制/追加到保持空间。g
/G
:将保持空间内容复制/追加到模式空间。
示例:sed -e '/test/h' -e '$G' file.txt
(复制匹配行到文件末尾)。
- 模式空间与保持空间:
五、地址定位与正则表达式
-
行号定位
sed '2d'
:删除第2行。sed '1,5s/old/new/
:处理1到5行。sed '$d'
:删除最后一行。
-
正则匹配
/pattern/
:匹配包含模式的行
示例:sed '/^192.168/p'
(打印以IP开头的行)。- 范围匹配:
/start/,/end/
示例:sed '/BEGIN/,/END/d'
(删除两标记之间的所有行)。
-
正则元字符
元字符 说明 示例 ^
行首锚定 /^test/
匹配以test
开头的行$
行尾锚定 /end$/
匹配以end
结尾的行\<
/\>
单词边界 /\<word\>/
匹配独立单词word
5
.*
任意字符 s/a.*b/xyz/
替换a
和b
之间的所有内容
六、典型应用示例
-
删除空行与注释
sed -r '/^$|^#/d' config.conf # 删除空行和注释行[3,5](@ref)
-
批量替换文件内容
sed -i 's/旧域名/新域名/g' *.html # 修改所有HTML文件的域名[6](@ref)
-
提取特定行
sed -n '10,20p' data.log # 仅输出第10到20行[3](@ref)
-
复杂文本重组
sed -n '1~2p' file.txt # 打印奇数行(步长为2)[3,5](@ref)
七、sed命令实例
-
向文件中添加或插入行
sed '3ahello' 1.txt
:向第三行后面添加hello,3表示行号。sed '/123/ahello' 1.txt
:向内容123后面添加hello,如果文件中有多行包括123,则每一行后面都会添加。sed '$ahello' 1.txt
:在最后一行添加hello。sed '3ihello' 1.txt
:在第三行之前插入hello。sed '/123/ihello' 1.txt
:在包含123的行之前插入hello,如果有多行包含123,则包含123的每一行之前都会插入hello。sed '$ihello' 1.txt
:在最后一行之前插入hello。
-
更改文件中指定的行
sed '1chello' 1.txt
:将文件1.txt的第一行替换为hello。sed '/123/chello' 1.txt
:将包含123的行替换为hello。sed '$chello' 1.txt
:将最后一行替换为hello。
-
删除文件中的行
sed '4d' 1.txt
:删除第四行。sed '1~2d' 1.txt
:从第一行开始删除,每隔2行就删掉一行,即删除奇数行。sed '1,2d' 1.txt
:删除1~2行。sed '1,2!。d' 1.txt
:删除1~2之外的所有行。sed '$d' 1.txt
:删除最后一行。sed '/123/d' 1.txt
:删除匹配123的行。sed '/123/,$d' 1.txt
:删除从匹配123的行到最后一行。sed '/123/,+1d' 1.txt
:删除匹配123的行及其后面一行。sed '/^$/d' 1.txt
:删除空行。sed '/123\|abc/!.d' 1.txt
:删除不匹配123或abc的行,/123|abc/表示匹配123或abc,!。表示取反。sed '1,3{/123/d}' 1.txt
:删除13行中,匹配内容123的行,1,3表示匹配13行,{/123/d}表示删除匹配123的行。
-
替换文件中的内容
sed 's/123/hello/' 1.txt
:将文件中的123替换为hello,默认只替换每行第一个123。sed 's/123/hello/g' 1.txt
:将文本中所有的123都替换为hello。sed 's/123/hello/2' 1.txt
:将每行中第二个匹配的123替换为hello。sed -n 's/123/hello/gpw 2.txt' 1.txt
:将每行中所有匹配的123替换为hello,并将替换后的内容写入2.txt。sed '/#/s/,.*//g' 1.txt
:匹配有#号的行,替换匹配行中逗号后的所有内容为空(,.*)表示逗号后的所有内容。sed 's/..$//g' 1.txt
:替换每行中的最后两个字符为空,每个点代表一个字符,表示匹配末尾(..)表示匹配最后两个字符。sed 's/^#.*//' 1.txt
:将1.txt文件中以#开头的行替换为空行,即注释的行(^#)表示匹配以#开头,(.*)代表所有内容。sed 's/^#.*//;/^$/d' 1.txt
:先替换1.txt文件中所有注释的空行为空行,然后删除空行,替换和删除操作中间用分号隔开。sed 's/^[0-9]/(&)/' 1.txt
:将每一行中行首的数字加上一个小括号(^[0-9])表示行首是数字,&符号代表匹配的内容。sed 's/[0−9][0−9]/(\1)/' 1.txt
:替换左侧特殊字符需转义,右侧不需要转义,\1代表匹配的内容。sed 's/$/&'haha'/' 1.txt
:在1.txt文件的每一行后面加上“haha”字段。
-
打印文件中的行
sed -n '3p' 1.txt
:打印文件中的第三行内容。sed -n '2~2p' 1.txt
:从第二行开始,每隔两行打印一行,波浪号后面的2表示步长。sed -n '$p' 1.txt
:打印文件的最后一行。sed -n '1,3p' 1.txt
:打印1到3行。sed -n '3,$p' 1.txt
:打印从第3行到最后一行的内容。sed -n '/you/p' 1.txt
:逐行读取文件,打印匹配you的行。sed -n '/bob/,3p' 1.txt
:逐行读取文件,打印从匹配bob的行到第3行的内容。sed -n '/you/,3p' 1.txt
:打印匹配you的行到第3行,也打印后面所有匹配you的行。sed -n '1,/too/p' 1.txt
:打印第一行到匹配too的行。sed -n '3,/you/p' 1.txt
:只打印第三行到匹配you的行。sed -n '/too/,$p' 1.txt
:打印从匹配too的行到最后一行的内容。sed -n '/too/,+1p' 1.txt
:打印匹配too的行及其向后一行,如果有多行匹配too,则匹配的每一行都会向后多打印一行。sed -n '/bob/,/too/p' 1.txt
:打印从匹配内容bob到匹配内容too的行。
-
打印文件的行号
sed -n "$=" 1.txt
:打印1.txt文件最后一行的行号(即文件有多少行,和wc -l功能类似)。sed -n '/error/=' 1.txt
:打印匹配error的行的行号。
八、模式空间中的编辑操作
-
地址定界
- #:#为数字,指定要进行处理操作的行。
- $:表示最后一行,多个文件进行操作的时候,为最后一个文件的最后一行。
- /regexp/:表示能够被regexp匹配到的行
九、sed的工作流程
sed的工作流程主要包括读取、执行和显示三个过程:
- 读取:sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
- 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
- 显示:发送修改后的内容到输出流。
十、注意事项
- 备份文件:使用
-i
时建议添加备份后缀(如-i.bak
)。 - 正则转义:特殊字符需转义,如
\/
需写作\\/
。 - 性能优化:对大文件避免频繁使用
-i
,可先处理输出到临时文件。
通过灵活组合选项、命令和正则表达式,sed可实现高效的文本处理,适合日志分析、配置修改等场景。更多高级用法可参考GNU sed手册或相关文档