2026/1/11 6:34:46
网站建设
项目流程
公司网站开发费用账务处理,红色礼品网站模板,那些企业需要做网站,建设企业银行app一、sed 工作流程和基本原理1. sed 的工作模式输入流 → 模式空间 → 执行命令 → 输出流↑保持空间 (可选)2. 两个缓冲区模式空间 (Pattern Space): 当前处理行的缓冲区保持空间 (Hold Space): 临时存储区#xff0c;用于跨行操作二、完整语法格式# 基本格式
sed [选项] 地址…一、sed 工作流程和基本原理1. sed 的工作模式输入流 → 模式空间 → 执行命令 → 输出流 ↑ 保持空间 (可选)2. 两个缓冲区模式空间 (Pattern Space): 当前处理行的缓冲区保持空间 (Hold Space): 临时存储区用于跨行操作二、完整语法格式# 基本格式 sed [选项] 地址范围 命令 [参数] 文件 sed [选项] -f 脚本文件 文件选项详解选项GNU sedBSD sed说明-n✓✓静默模式不自动打印模式空间-e✓✓指定多个编辑命令-f✓✓从文件读取脚本-i[后缀]✓✓原地编辑可选备份后缀-r/-E-r-E使用扩展正则-l✓✗设置行长度--posix✓✗遵循 POSIX 标准-u✓✗无缓冲 I/O-z✓✗用 NUL 字符分隔行三、地址定位寻址1. 单地址# 行号 sed 5命令 file # 第5行 sed $命令 file # 最后一行 # 正则表达式 sed /pattern/命令 file # 匹配pattern的行 sed /^#/命令 file # 以#开头的行2. 地址范围# 行号范围 sed 10,20命令 file # 第10-20行 sed 5,3命令 file # 第5行及后面3行 sed 2,~2命令 file # 第2行开始每隔2行 (GNU特有) # 正则范围 sed /start/,/end/命令 file sed /^BEGIN$/,/^END$/命令 file # 混合范围 sed 5,/pattern/命令 file # 第5行到匹配行 sed /pattern/,10命令 file # 匹配行到第10行3. 步进地址 (GNU特有)sed 1~2命令 file # 奇数行 (1,3,5...) sed 2~3命令 file # 从第2行开始每隔3行 (2,5,8...) sed 0~2命令 file # 偶数行 (0表示第一行匹配)4. 地址否定sed 地址!命令 file # 不匹配地址的行执行命令 sed 1,5!d file # 删除除1-5行外的所有行 sed /^#/!p file # 打印非注释行四、完整命令集1. 文本转换命令s- 替换# 语法: s/正则/替换/标志 sed s/old/new/ # 每行第一个 sed s/old/new/g # 全局替换 sed s/old/new/2 # 每行第2次出现 sed s/old/new/2g # 从第2次开始全局 sed s/old/new/p # 打印替换的行 sed s/old/new/w 文件 # 写入文件 sed s/old/new/i # 忽略大小写 (GNU) sed s/old/new/I # 忽略大小写 (BSD) sed s/old/new/M # 多行模式 (GNU) sed s/old/new/e # 执行替换内容作为命令 (GNU危险!)y- 字符转换 (类似tr)# 语法: y/源字符集/目标字符集/ sed y/abc/ABC/ # a→A, b→B, c→C sed y/a-z/A-Z/ # 小写转大写2. 行操作命令d- 删除sed 3d file # 删除第3行 sed /pattern/d # 删除匹配行 sed 1,5d # 删除1-5行D- 删除模式空间的第一行# 删除直到第一个换行符 sed N;D # 保留最后一行p- 打印sed -n /pattern/p # 只打印匹配行 sed 1,5p # 打印1-5行(会重复)P- 打印模式空间的第一行sed -n N;P # 打印每对行的第一行n- 读取下一行sed n;s/old/new/ # 处理偶数行 sed /pattern/{n;s/old/new/} # 匹配行的下一行N- 追加下一行到模式空间sed N;s/\n/ / # 合并相邻两行 sed N;/foo\nbar/d # 删除包含foo和bar的相邻行a- 追加文本 (行后)sed 3a\新文本 # 第3行后追加 sed /pattern/a\新文本 # 匹配行后追加 # 多行文本 sed 2a\ 第一行\ 第二行\ 第三行 filei- 插入文本 (行前)sed 3i\新文本 # 第3行前插入c- 替换整行sed 5c\新行内容 # 替换第5行 sed /pattern/c\新行内容 # 替换匹配行3. 文件操作命令r- 读取文件内容sed 3r 其他文件 # 在第3行后插入文件内容 sed /pattern/r 文件 # 在匹配行后插入w- 写入文件sed /pattern/w 输出文件 # 将匹配行写入文件 sed 1,10w 前十行.txt # 写入1-10行4. 流控制命令b- 分支跳转# 语法: [地址]b[标签] sed s/foo/bar/; t; s/baz/qux/ # 如果s成功则跳转 sed /pattern/b end; s/old/new/; :endt- 测试跳转 (如果s///成功)sed s/foo/bar/; t; s/baz/qux/ # 如果foo替换成功跳过第二个替换T- 测试跳转 (如果s///失败) (GNU)sed s/foo/bar/; T error; d; :error # 如果替换失败跳转:- 定义标签sed :mylabel; commands; b mylabelq/Q- 退出sed 5q # 处理到第5行退出 sed /pattern/q # 遇到匹配行退出 sed /pattern/Q # GNU: 不打印当前行退出5. 缓冲区操作命令 (保持空间)h/H- 复制/追加到保持空间h # 复制模式空间→保持空间(覆盖) H # 追加模式空间→保持空间(加换行符)g/G- 复制/追加到模式空间g # 复制保持空间→模式空间(覆盖) G # 追加保持空间→模式空间(加换行符)x- 交换两个空间x # 交换模式空间和保持空间6. 其他命令- 打印行号sed -n /pattern/ # 打印匹配行的行号 sed file | sed N;s/\n/: / # 添加行号前缀l- 显示不可见字符sed -n l file # 显示控制字符为\n,\t等v- 版本检查 (GNU)sed v 4.0 # 需要GNU sed 4.0五、高级技巧和模式1. 分支和标签 (实现循环)# 移除多行注释 /* ... */ sed /\/\*/{:a; N; /\/\*.*\*\//!ba; s/\/\*.*\*\///g} file # 删除HTML标签 sed -r :a; s/[^]*//g; // {N; ba} file2. 多行模式处理# 合并连续空白行为一行 sed /^$/{N; /^\n$/D} file # 段落格式化 sed /^$/!{H;d;}; x; s/\n/ /g; s/^ //; p; x; d file3. 模拟其他命令# 模拟 head -n 10 sed 10q file # 模拟 tail -n 10 sed -e :a -e $q;N;11,$D;ba file # 模拟 tac (反转行序) sed 1!G;h;$!d file # 模拟 grep -n sed -n /pattern/{;p} | sed N;s/\n/:/ # 模拟 uniq sed $!N; /^\(.*\)\n\1$/!P; D file4. 数值计算和操作# 行号计算 sed file | sed N; s/^/0000/; s/^0*\([0-9]\{4,\}\)\n/\1 / # 递增数字 sed s/[0-9]//g; s/^/0/; s/0/1/g; s/1/2/g; s/2/3/g; s/3/4/g; s/4/5/g; s/5/6/g; s/6/7/g; s/7/8/g; s/8/9/g; s/9//g; s/^0//; s/$// file5. CSV/TSV处理# 交换第2和第3列 (逗号分隔) sed -r s/^([^,]*),([^,]*),([^,]*)/\1,\3,\2/ # 转置CSV (简单情况) sed -r :a; N; $!ba; s/,/\n/g; s/\n/,/; P; D6. 递归处理# 替换嵌套括号内容 sed :a; s/\(([^()]*)\)/\1/g; ta7. 复杂文本重组# 格式化数字 (每三位加逗号) sed -r :a; s/([0-9])([0-9]{3})($|[^0-9])/\1,\2\3/; ta六、sed脚本编程1. 脚本文件格式# script.sed #!/usr/bin/sed -f # 注释 /pattern/ { s/old/new/ p d }2. 条件执行# if-then-else 模拟 sed /pattern/{s/old/new/; b end}; s/other/changed/; :end3. 循环结构# while循环模拟 sed :loop; /条件/ {命令; b loop}七、性能优化技巧1. 减少模式空间操作# 差: 多次替换 sed -e s/a/A/ -e s/b/B/ -e s/c/C/ file # 好: 一次替换多个 sed y/abc/ABC/ file # 更好: 使用字符类 sed s/[abc]/\U/g file2. 提前退出# 找到目标后停止处理 sed /target/{p; q} 大文件3. 批量操作# 处理多个文件时 sed -i.bak s/old/new/g *.txt4. 避免回溯# 差: 贪婪匹配 sed s/.*\(target\).*/\1/ # 好: 非贪婪匹配 (GNU sed) sed -r s/.*?(target).*/\1/八、POSIX与GNU/BSD差异特性POSIXGNU sedBSD sed扩展正则不支持-r-E大小写忽略s///i(未定义)✓✓\s,\w类不支持✓✓\u,\L转换不支持✓✗原地编辑未定义-i-i 行寻址基本扩展(~,)基本-z选项不支持✓✗九、实际案例库1. 日志处理# 提取时间范围内的日志 sed -n /2024-01-01 09:/,/2024-01-01 10:/p logfile # 删除ANSI颜色代码 sed s/\x1B\[[0-9;]*[JKmsu]//g file # 统计IP出现次数 sed -n s/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p | sort | uniq -c2. 代码处理# 缩进转换 (2空格→4空格) sed s/^ / /g file.py # 移除尾随空格 sed s/[[:space:]]*$// file # 标准化换行符 sed s/\r$// file # CRLF→LF3. 数据处理# CSV转Markdown表格 sed 1s/^/| /; 1s/,/ | /g; 1s/$/ |/; 2s/.*/|---|---|/; 3,$s/^/| /; 3,$s/,/ | /g; 3,$s/$/ |/ # JSON美化 (简单) sed s/{/{\n /g; s/,/,\n /g; s/}/\n}/g4. 系统管理# 批量重命名 ls *.txt | sed s/\(.*\)\.txt/mv \1.md/ | sh # 生成配置文件 seq 1 10 | sed s/^/server 192.168.1./; s/$/ weight1;/ # 监控日志变化 tail -f logfile | sed /ERROR/,5p十、调试和错误处理1. 调试技巧# 显示执行过程 (GNU) sed --debug script.sed file # 逐步调试 echo test | sed s/t/T/; l; s/e/E/; l # 查看模式空间 sed -n l file | cat -A2. 常见错误# 错误: 未转义分隔符 sed s/http://example.com// # 错误 sed s|http://example.com/|| # 正确 # 错误: 贪婪匹配 sed s/.*foo/bar/ # 可能非预期 sed s/[^f]*foo/bar/ # 更好 # 错误: 原地编辑权限 sed -i s/old/new/ /etc/passwd # 需要sudo3. 安全注意事项# 危险: e命令执行外部命令 sed s/.*/;/e file # 可能执行恶意代码 # 危险: 处理不可信输入 cat user_input | sed s/.*// # 可能包含恶意模式 # 安全实践 sed s/[\]/\\/g file # 转义特殊字符十一、sed极限和替代方案sed适合的场景简单文本替换行级别的过滤流式处理大文件与管道配合的简单转换考虑其他工具的场景复杂文本结构 → awk, perl, python需要数据结构 → awk, perl大量字符串操作 → perl, python需要GUI交互 → 文本编辑器这个指南几乎涵盖了sed的所有功能。sed的强大之处在于它的简洁和流式处理能力但对于非常复杂的文本处理建议结合awk或其他脚本语言使用。记住保持sed脚本简单可读复杂的逻辑可能更适合用其他工具实现。