Linux命令-sed(流编辑器)

发布时间:2026/7/21 7:28:26

Linux命令-sed(流编辑器) Linux命令-sed流编辑器快速参考基本语法常用选项替换命令详解删除命令打印命令插入和追加命令实际应用示例⚠️ 危险操作警告与回滚sed 与其他工具对比总结快速参考sedStream Editor是 Linux 下最强大的文本处理工具之一。它逐行读取输入按指定的规则进行过滤和转换然后输出结果。sed支持替换、删除、插入、追加等操作特别擅长批量文本替换和行过滤是 Shell 脚本中处理文本的利器。核心优势非交互式文本处理、支持正则表达式、原地编辑、管道友好。基本语法# 基本语法sed[选项]命令[文件...]# 替换文本seds/old/new/file.txt# 全局替换seds/old/new/gfile.txt# 原地编辑修改文件sed-is/old/new/gfile.txt# 多个命令sed-es/old1/new1/g-es/old2/new2/gfile.txt常用选项# -i 原地编辑直接修改文件sed-is/old/new/gfile.txt# -i.bak 原地编辑并创建备份sed-i.baks/old/new/gfile.txt# 会创建 file.txt.bak 备份文件# -n 仅输出被命令处理过的行与 p 命令配合sed-n/pattern/pfile.txt# -e 指定多个命令sed-es/a/A/g-es/b/B/gfile.txt# -f 从文件读取命令sed-fscript.sed file.txt# -r, -E 使用扩展正则表达式sed-rs/[0-9]/NUMBER/gfile.txt替换命令详解# s/old/new/flags# 基本替换仅替换每行第一个匹配echofoo bar foo|seds/foo/baz/# 输出baz bar foo# 全局替换替换所有匹配echofoo bar foo|seds/foo/baz/g# 输出baz bar baz# 替换第 N 个匹配echoaaa|seds/a/b/2# 输出aba仅替换第2个# 使用不同的分隔符适合路径替换seds|/old/path|/new/path|gfile.txt# 使用 引用匹配内容echohello world|seds/[a-z]*/[]/# 输出[hello] world# 使用 \1, \2 引用捕获组echo2024-01-10|sed-rs/([0-9])-([0-9])-([0-9])/\2\/\3\/\1/# 输出01/10/2024# 忽略大小写替换echoHello HELLO|seds/hello/world/gi# 输出world world删除命令# d 命令删除匹配的行# 删除空行sed/^$/dfile.txt# 删除注释行sed/^#/dfile.txt# 删除包含特定字符串的行sed/pattern/dfile.txt# 删除第 5 行sed5dfile.txt# 删除第 1-5 行sed1,5dfile.txt# 删除最后一行sed$dfile.txt# 删除从匹配到文件末尾的行sed/pattern/,$dfile.txt# 删除所有空行和注释行sed-e/^$/d-e/^#/dfile.txt打印命令# p 命令打印匹配的行通常与 -n 配合# 打印包含 pattern 的行sed-n/pattern/pfile.txt# 打印第 5 行sed-n5pfile.txt# 打印第 1-5 行sed-n1,5pfile.txt# 打印最后一行sed-n$pfile.txt# 打印从匹配行到文件末尾sed-n/pattern/,$pfile.txt# 打印行号sed-n/pattern/file.txt插入和追加命令# a 命令在匹配行后追加# 在第 3 行后追加文本sed3a\This is a new linefile.txt# 在匹配行后追加sed/pattern/a\New line after patternfile.txt# i 命令在匹配行前插入# 在第 3 行前插入文本sed3i\This is inserted before line 3file.txt# c 命令替换整行sed/pattern/c\This replaces the entire linefile.txt实际应用示例# 示例1修改配置文件 # 修改 SSH 端口sudosed-is/^#Port 22/Port 2222//etc/ssh/sshd_config# 禁用 root 登录sudosed-is/^PermitRootLogin yes/PermitRootLogin no//etc/ssh/sshd_config# 示例2批量替换文件中的字符串 # 将所有 .txt 文件中的 old_name 替换为 new_namesed-is/old_name/new_name/g*.txt# 示例3删除 HTML 标签 seds/[^]*//gindex.html# 示例4提取特定列 # 从 /etc/passwd 提取用户名和 Shellsed-rs/^([^:]):([^:]*:){5}([^:]).*/\1 - \3//etc/passwd# 示例5在文件开头添加内容 sed-i1i\#!/bin/bashscript.sh# 示例6去除行尾空格 sed-is/[[:space:]]*$//file.txt# 示例7多行替换 # 删除 C 风格注释 /* ... */sed/\/\*/,/\*\//dfile.c# 示例8删除 Windows 行尾的 \r sed-is/\r$//file.txt⚠️ 危险操作警告与回滚# ⚠️ 危险操作sed -i 不加备份sed-is/old/new/gimportant_file.txt# 如果替换错误原文件已被修改无法恢复# ✅ 安全做法1先备份sed-i.baks/old/new/gimportant_file.txt# 会创建 important_file.txt.bak 备份# ✅ 安全做法2先用 -n 预览sed-ns/old/new/gpimportant_file.txt# 仅显示被替换的行# ✅ 安全做法3先输出到新文件seds/old/new/gimportant_file.txtimportant_file_new.txt# 确认无误后再替换mvimportant_file_new.txt important_file.txt# 回滚方案# 如果使用了 -i.bak可以从备份恢复cpimportant_file.txt.bak important_file.txtsed 与其他工具对比# 简单替换sed 最方便 seds/old/new/gfile.txt# 复杂文本处理awk 更灵活 awk{gsub(/old/, new); print}file.txt# 多文件替换使用 find sed find.-name*.txt-execsed-is/old/new/g{}# 交互式编辑使用 vim vimfile.txt# :%s/old/new/g总结核心价值sed是非交互式文本处理的瑞士军刀特别擅长批量替换和行过滤。常用组合sed s/old/new/g file替换sed -i s/old/new/g file原地替换sed -i.bak s/old/new/g file原地替换备份sed /pattern/d file删除匹配行sed -n /pattern/p file打印匹配行sed s/\r$// file删除 Windows 换行符⚠️ 注意使用-i原地编辑时务必先备份或使用-i.bak。

相关新闻