
sed(stream editor)是Linux/Unix系统中非交互式的流编辑器,它能够对文本数据流进行过滤和转换。sed逐行处理输入,根据脚本命令对每一行执行编辑操作(如替换、删除、插入、追加等),非常适合在管道中进行批量文本处理。
与交互式编辑器(如vim)不同,sed是命令行驱动的,可以集成到脚本中自动处理大量文件。sed的核心是使用正则表达式进行模式匹配和替换,常用于配置文件修改、日志清洗、文本格式转换等场景。掌握sed是Linux文本处理的重要技能。
1. 基本语法
| 命令 | 说明 |
|---|
sed 'script' file | |
sed -n 'script' file | |
printf '%s\n' "text" | sed 'script' | |
sed -e 'cmd1' -e 'cmd2' file | |
sed -f script.sed file | |
2. 常用选项
3. 替换操作
使用s/old/new/格式替换文本:
| 命令 | 说明 |
|---|
sed 's/old/new/' file | |
sed 's/old/new/g' file | |
sed 's/old/new/2' file | |
sed 's/old/new/Ig' file | |
sed 's|/usr|/opt|g' file | |
sed -n 's/old/new/p' file | |
sed 's/old/new/w out.txt' file | |
4. 地址范围
将命令应用到特定行或模式:
| 命令 | 说明 |
|---|
sed '3s/a/b/' file | |
sed '1,5s/a/b/' file | |
sed '/pattern/s/a/b/' file | |
sed '3,/pattern/s/a/b/' file | |
sed '/start/,/end/d' file | |
sed '/start/,+2d' file | |
sed '1~2d' file | |
5. 打印与删除
| 命令 | 说明 |
|---|
sed -n 'p' file | |
sed -n '3p' file | |
sed -n '/pattern/p' file | |
sed -n '1,5p' file | |
sed -n '$p' file | |
sed 'd' file | |
sed '3d' file | |
sed '/pattern/d' file | |
sed '/^$/d' file | |
sed '/^#/d' file | |
6. 插入、追加、替换行
| 命令 | 说明 |
|---|
sed '2i\new line' file | |
sed '2a\new line' file | |
sed '2c\new line' file | |
sed '/pattern/i\new line' file | |
sed '/pattern/a\new line' file | |
sed '$a\new line' file | |
注意: 在脚本或单引号中,反斜杠后的换行符是必要的。在命令行中可直接使用:sed '2i\new line' file
7. 其他命令
| 命令 | 说明 |
|---|
sed 'y/abc/xyz/' file | |
sed '=' file | |
sed -n '=' file | |
sed 'q' file | |
sed '3q' file | |
sed 'n' file | |
sed 'N' file | |
sed '/pattern/r other.txt' file | |
sed '/pattern/w out.txt' file | |
8. 原地编辑
直接修改文件内容(谨慎使用):
| 命令 | 说明 |
|---|
sed -i 's/old/new/g' file | |
sed -i.bak 's/old/new/g' file | |
sed -i '' 's/old/new/g' file | |
sed -i -e 's/a/b/' -e 's/c/d/' file | |
9. 正则表达式与捕获组
| 命令 | 说明 |
|---|
sed 's/[0-9]\{4\}/YEAR/' file | |
sed -E 's/[0-9]{4}/YEAR/g' file | |
sed 's/\(foo\)bar/\1baz/' file | |
sed -E 's/(foo)bar/\1baz/' file | |
sed -E 's#(https?)://#\1://#' file | |
sed -E 's/\b([0-9]+)\b/*\1*/g' file | |
sed -E 's/^([^,]*),(.*)/\2,\1/' file | |
10. 实用组合模式
| 命令 | 说明 |
|---|
sed 's/[[:space:]]\+$//' file | |
sed 's/^[[:space:]]\+//' file | |
sed 's/[[:space:]]\+/ /g' file | |
sed '/^#/d; /^$/d' file | |
sed -n 'n;p' file | |
sed -n 'p;n' file | |
sed '1!G;h;$!d' file | |
sed 's/.*/\L&/' file | |
sed 's/.*/\U&/' file | |
| |
11. 常用选项速查
12. sed vs awk 对比
13. 故障排查
| 问题 | 解决方法 |
|---|
| sed: -e expression #1, char X: unterminated 's' command | |
| 替换中的斜杠被误解析 | |
| 原地编辑在macOS上失败 | macOS使用sed -i '' 's/old/new/g' file |
| 扩展正则不生效 | |
| 捕获组替换不工作 | 基本正则需转义括号:\(...\);扩展正则用(...) |
| 命令不输出结果 | |
| 多行匹配失败 | |
| 特殊字符需要转义 | / |
温馨提示: sed是文本处理利器,建议掌握以下技巧:1)先用不带-i的命令测试,确认效果后再原地修改;2)使用-i.bak备份原文件是安全做法;3)使用交替分隔符避免转义混乱;4)-n配合p可以实现精确行提取;5)扩展正则表达式(-E)更易读写;6)复杂编辑可写入.sed文件用-f执行。在管道中使用sed时,不需要-i选项,直接输出到stdout。对于涉及字段计算的场景,awk可能是更好的选择。
关注公众号(haopython),请回复: LTSED