引言
在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 |
| |
| |
| |
| # 使用-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* |
| |
四、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 |
| |
| |
| |
| |
| |
高级替换选项:
| # 全局替换(替换所有匹配项) |
| [root@server ~]# echo "apple apple banana" | sed 's/apple/orange/g' |
| |
| |
| # 忽略大小写 |
| [root@server ~]# echo "Apple apple" | sed 's/apple/orange/i' |
| |
| |
| # 替换第2次出现的匹配项 |
| [root@server ~]# echo "apple apple banana" | sed 's/apple/orange/2' |
| |
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 |
| |
| 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 |
| |
| |
| |
| |
| |
4. 数据转换
| # 将CSV文件转换为制表符分隔 |
| [root@server ~]# echo -e "name,age,city\nAlice,25,New York\nBob,30,Los Angeles" | sed 's/,/\t/g' |
| |
| |
| |
七、总结
sed作为Linux三剑客之一,以其高效、灵活的特点成为文本处理的利器。通过掌握sed的各种参数和动作,我们可以轻松完成文本的增删改查、格式转换等操作。
关键要点回顾:
-n:参数控制输出,避免重复显示-i:参数直接修改文件,需谨慎使用p/d/a/i/c/s:等动作覆盖基本文本操作需求
sed的学习曲线相对平缓,但功能强大,多动手实践,逐步掌握这个强大的工具。