当前位置:首页>Linux>Linux三剑客之SED:从入门到精通

Linux三剑客之SED:从入门到精通

  • 2026-09-07 06:32:09
Linux三剑客之SED:从入门到精通

引言

在Linux文本处理三剑客(grep、sed、awk)中,sed(Stream Editor)作为流编辑器,以其高效、灵活的特点成为系统管理员和开发者的必备工具。sed可以逐行处理文本文件,无需打开整个文件,特别适合处理大型日志文件或配置文件。今天,我们就来深入探索这个强大的文本处理工具。

一、sed的基本概念

sed是一种非交互式的流编辑器,它一次处理一行内容,将当前处理的行存储在临时缓冲区(称为"模式空间")中,处理完成后将缓冲区内容送往屏幕。这种处理方式使得sed能够高效处理大文件,而不会像vim那样需要将整个文件加载到内存中。

二、sed的基本语法

sed [选项] '命令' 文件
复制代码

三、sed的常用参数详解

1. -n:安静模式

默认情况下,sed会处理所有行并输出到屏幕。使用-n参数可以只显示被sed处理的行。

# 创建测试文件
[root@server ~]# cat test.txt
第一行
第二行
第三行
第四行
第五行
# 不使用-n参数(默认行为)
[root@server ~]# sed '2p' test.txt
第一行
第二行
第二行
第三行
第四行
第五行
# 使用-n参数
[root@server ~]# sed -n '2p' test.txt
第二行
复制代码

2. -e:直接在命令行编辑

允许在命令行中直接编辑,可以同时执行多个命令。

# 同时执行两个命令
[root@server ~]# sed -n -e '2p' -e '4p' test.txt
第二行
第四行
复制代码

3. -f:从文件中读取命令

将sed命令写入文件,然后使用-f参数执行。

# 创建命令文件
[root@server ~]# cat sed_commands.sed
2p
4p
# 使用-f参数执行
[root@server ~]# sed -f sed_commands.sed test.txt
第二行
第四行
复制代码

4. -r:使用扩展正则表达式

默认情况下,sed使用基础正则表达式。-r参数启用扩展正则表达式。

# 基础正则表达式
[root@server ~]# sed -n '/行/p' test.txt
第一行
第二行
第三行
第四行
第五行
# 扩展正则表达式(匹配"第"后跟一个或多个数字)
[root@server ~]# sed -rn '/第[0-9]+行/p' test.txt
第一行
第二行
第三行
第四行
第五行
复制代码

5. -i:直接编辑原文件

默认情况下,sed只输出到屏幕,不修改原文件。-i参数直接修改原文件。

# 修改前
[root@server ~]# cat test.txt
第一行
第二行
第三行
第四行
第五行
# 使用-i参数修改
[root@server ~]# sed -i '2c\修改后的第二行' test.txt
# 修改后
[root@server ~]# cat test.txt
第一行
修改后的第二行
第三行
第四行
第五行
复制代码

注意:-i参数是危险操作,建议先备份文件或使用-i.bak创建备份。

# 创建备份
[root@server ~]# sed -i.bak '2c\修改后的第二行' test.txt
[root@server ~]# ls test.txt*
test.txt  test.txt.bak
复制代码

四、sed的常用动作说明

1. p:打印

打印匹配的行,通常与-n参数一起使用。

[root@server ~]# sed -n '1,3p' test.txt
第一行
修改后的第二行
第三行
复制代码

2. d:删除

删除匹配的行。

# 删除第2行
[root@server ~]# sed '2d' test.txt
第一行
第三行
第四行
第五行
复制代码

3. a:追加

在指定行后添加新行。

# 在第2行后追加新行
[root@server ~]# sed '2a\新增的行' test.txt
第一行
修改后的第二行
新增的行
第三行
第四行
第五行
复制代码

4. i:插入

在指定行前插入新行。

# 在第2行前插入新行
[root@server ~]# sed '2i\插入的行' test.txt
第一行
插入的行
修改后的第二行
第三行
第四行
第五行
复制代码

5. c:替换

替换整行内容。

# 替换第2行
[root@server ~]# sed '2c\替换后的行' test.txt
第一行
替换后的行
第三行
第四行
第五行
复制代码

6. s:字符串替换

替换字符串,可以配合正则表达式使用。

# 替换"第三行"为"新第三行"
[root@server ~]# sed 's/第三行/新第三行/' test.txt
第一行
替换后的行
新第三行
第四行
第五行
复制代码

高级替换选项:

  • g:全局替换
  • i:忽略大小写
  • 数字:指定替换次数
# 全局替换(替换所有匹配项)
[root@server ~]# echo "apple apple banana" | sed 's/apple/orange/g'
orange orange banana
# 忽略大小写
[root@server ~]# echo "Apple apple" | sed 's/apple/orange/i'
Apple orange
# 替换第2次出现的匹配项
[root@server ~]# echo "apple apple banana" | sed 's/apple/orange/2'
apple orange banana
复制代码

7. w:写入文件

将匹配的行写入指定文件。

# 将第2-4行写入新文件
[root@server ~]# sed -n '2,4w output.txt' test.txt
[root@server ~]# cat output.txt
替换后的行
新第三行
第四行
复制代码

8. =:打印行号

打印匹配行的行号。

[root@server ~]# sed -n '/第三行/=' test.txt
3
复制代码

五、sed的高级应用

1. 范围地址

使用逗号指定行范围。

# 处理第2-4行
[root@server ~]# sed -n '2,4p' test.txt
替换后的行
新第三行
第四行
复制代码

2. 正则表达式地址

使用正则表达式匹配行。

# 匹配包含"第三"的行
[root@server ~]# sed -n '/第三/p' test.txt
新第三行
复制代码

3. 多命令组合

使用分号;组合多个命令。

# 在第2行后追加新行并删除第4行
[root@server ~]# sed '2a\新增行;4d' test.txt
第一行
替换后的行
新增行
新第三行
第五行
复制代码

4. 模式空间和保持空间

sed有两个特殊的缓冲区:

  • 模式空间:当前处理的行
  • 保持空间:临时存储区域
# 交换模式空间和保持空间
[root@server ~]# sed 'h;g' test.txt
第一行
替换后的行
新第三行
第四行
第五行
复制代码

六、实战案例

1. 处理日志文件

# 查找包含"ERROR"的行并显示行号
[root@server ~]# sed -n '/ERROR/=' app.log
15
42
78
# 删除包含"DEBUG"的行
[root@server ~]# sed '/DEBUG/d' app.log > clean.log
复制代码

2. 批量重命名文件

# 将所有.txt文件重命名为.bak文件
[root@server ~]# ls *.txt
file1.txt file2.txt file3.txt
[root@server ~]# ls *.txt | sed 's/.*/mv & &.bak/' | sh
[root@server ~]# ls
file1.txt  file1.txt.bak  file2.txt  file2.txt.bak  file3.txt  file3.txt.bak
复制代码

3. 提取配置信息

# 提取/etc/passwd文件中的用户名和UID
[root@server ~]# sed -n 's/\([^:]*\):[^:]*:\([^:]*\).*/用户名: \1, UID: \2/p' /etc/passwd | head -5
用户名: root, UID: 0
用户名: bin, UID: 1
用户名: daemon, UID: 2
用户名: adm, UID: 3
用户名: lp, UID: 4
复制代码

4. 数据转换

# 将CSV文件转换为制表符分隔
[root@server ~]# echo -e "name,age,city\nAlice,25,New York\nBob,30,Los Angeles" | sed 's/,/\t/g'
name    age     city
Alice   25      New York
Bob     30      Los Angeles
复制代码

七、总结

sed作为Linux三剑客之一,以其高效、灵活的特点成为文本处理的利器。通过掌握sed的各种参数和动作,我们可以轻松完成文本的增删改查、格式转换等操作。

关键要点回顾:

  1. -n:参数控制输出,避免重复显示
  2. -i:参数直接修改文件,需谨慎使用
  3. p/d/a/i/c/s:等动作覆盖基本文本操作需求
  4. 结合正则表达式实现复杂模式匹配
  5. 管道和重定向扩展sed的应用场景

sed的学习曲线相对平缓,但功能强大,多动手实践,逐步掌握这个强大的工具。

最新文章

随机文章