Linux sed文本处理实战
linux sed
sed 是 Linux / Unix 系统中非常常用的文本处理工具,全称为 Stream Editor,即“流编辑器”。它主要用于对文本进行查找、替换、删除、插入、打印、提取等操作。相比直接打开文件编辑,sed 更适合批量处理日志、配置文件、代码文本以及大量重复性文本任务。
一、sed 的基本用法
sed 的常见语法如下:
sed [选项] '命令' 文件名
例如,查看文件内容:
sed '' example.txt
或者直接使用:
sed -n 'p' example.txt
其中 -n 表示不默认输出,p 表示打印匹配行。
如果不加 -n,sed 默认会把每一行都输出一次,因此很多场景下需要配合 -n 使用。
二、打印指定行
查看第 5 行内容:
sed -n '5p' example.txt
查看第 5 到第 10 行:
sed -n '5,10p' example.txt
查看包含关键词的行:
sed -n '/error/p' log.txt
如果只想查看第一次出现的位置,可以使用:
sed -n '/error/{p;q;}' log.txt
这里的 q 表示退出处理。
三、文本替换
sed 最常见的功能是替换文本。
替换每行中第一个匹配的 old:
sed 's/old/new/' example.txt
替换每行中所有匹配的 old:
sed 's/old/new/g' example.txt
只替换第 2 个匹配项:
sed 's/old/new/2' example.txt
只处理包含 error 的行,并把其中的 warn 替换为 alert:
sed '/error/s/warn/alert/g' log.txt
如果要直接修改原文件,需要加 -i:
sed -i 's/old/new/g' example.txt
建议修改前先备份:
sed -i.bak 's/old/new/g' example.txt
这样会生成一个 example.txt.bak 备份文件。
四、删除指定行
删除第 3 行:
sed '3d' example.txt
删除第 5 到第 10 行:
sed '5,10d' example.txt
删除空行:
sed '/^$/d' example.txt
删除包含 debug 的行:
sed '/debug/d' log.txt
如果直接删除原文件中的内容:
sed -i '/debug/d' log.txt
五、插入和追加内容
在第 3 行前插入内容:
sed '3i\这是一行新内容' example.txt
在第 3 行后追加内容:
sed '3a\追加的新内容' example.txt
在匹配 server 的行前插入配置:
sed '/server/i\port=8080' config.txt
这些操作常用于批量生成配置文件或补充日志标记。
六、显示行号
sed 可以配合 = 显示行号:
sed '=' example.txt | sed 'N;s/\n/\t/'
查找关键词所在行号:
sed -n '/error/=' log.txt
如果要同时显示行号和对应内容,可以使用:
sed -n '/error/{=;p;}' log.txt
七、常用选项说明
| 选项 | 作用 |
|---|---|
-n |
不自动输出 |
-i |
直接修改原文件 |
-e |
同时执行多个 sed 命令 |
-f |
从脚本文件中读取 sed 命令 |
-r 或 -E |
使用扩展正则表达式 |
例如,同时执行删除空行和替换文本:
sed -e '/^$/d' -e 's/error/ERROR/g' log.txt
也可以写成:
sed -e '/^$/d; s/error/ERROR/g' log.txt
八、sed 与正则表达式
sed 的强大之处在于支持正则表达式。
匹配行首:
sed -n '/^start/p' file.txt
匹配行尾:
sed -n '/end$/p' file.txt
匹配任意字符:
sed -n '/log./p' file.txt
匹配数字:
sed -n '/[0-9]/p' file.txt
匹配多个连续数字:
sed -n '/[0-9][0-9]*/p' file.txt
使用扩展正则表达式时更简洁:
sed -n -E '/[0-9]+/p' file.txt
九、sed 的实际应用场景
1. 批量修改配置文件
例如把配置文件中的端口从 8080 改为 9000:
sed -i 's/8080/9000/g' app.conf
2. 清理日志文件
删除空行:
sed '/^$/d' app.log
删除包含测试标记的行:
sed '/TEST/d' app.log
3. 提取关键信息
提取包含 ERROR 的日志:
sed -n '/ERROR/p' app.log
提取 IP 地址示例:
sed -n -E 's/.*([0-9]{1,3}(\.[0-9]{1,3}){3}).*/\1/p' access.log
4. 批量处理代码
例如把代码中的 console.log 替换为空:
sed -i 's/console\.log([^;]*);//g' app.js
十、使用 sed 的注意事项
- 使用
-i修改文件前,建议先备份。 - 替换特殊字符时,需要注意转义,例如
/、.、$。 - 如果文本中包含很多斜杠,可以更换分隔符:
sed 's|/usr/local|/opt|g' file.txt
- 复杂文本处理可以结合
grep、awk、sort等命令使用。 - 对重要文件执行批量替换前,最好先用不加
-i的命令预览结果。
例如先预览:
sed 's/old/new/g' config.txt
确认无误后再修改:
sed -i 's/old/new/g' config.txt
总结
sed 是 Linux 中非常实用的文本处理工具,适合完成查找、替换、删除、插入、提取和批量修改等任务。它命令简洁、效率高,尤其适合处理日志文件、配置文件和大量文本数据。掌握 sed 的基础语法、常用选项以及正则表达式后,可以显著提升 Linux 系统管理和自动化运维的工作效率。