Linux命令-sed(流编辑器)
2026/7/21 7:28:16 网站建设 项目流程

Linux命令-sed(流编辑器)

    • 快速参考
    • 基本语法
    • 常用选项
    • 替换命令详解
    • 删除命令
    • 打印命令
    • 插入和追加命令
    • 实际应用示例
    • ⚠️ 危险操作警告与回滚
    • sed 与其他工具对比
    • 总结

快速参考

sed(Stream Editor)是 Linux 下最强大的文本处理工具之一。它逐行读取输入,按指定的规则进行过滤和转换,然后输出结果sed支持替换、删除、插入、追加等操作,特别擅长批量文本替换和行过滤,是 Shell 脚本中处理文本的利器。

核心优势:非交互式文本处理、支持正则表达式、原地编辑、管道友好。

基本语法

# 基本语法sed[选项]'命令'[文件...]# 替换文本sed's/old/new/'file.txt# 全局替换sed's/old/new/g'file.txt# 原地编辑(修改文件)sed-i's/old/new/g'file.txt# 多个命令sed-e's/old1/new1/g'-e's/old2/new2/g'file.txt

常用选项

# -i 原地编辑(直接修改文件)sed-i's/old/new/g'file.txt# -i.bak 原地编辑并创建备份sed-i.bak's/old/new/g'file.txt# 会创建 file.txt.bak 备份文件# -n 仅输出被命令处理过的行(与 p 命令配合)sed-n'/pattern/p'file.txt# -e 指定多个命令sed-e's/a/A/g'-e's/b/B/g'file.txt# -f 从文件读取命令sed-fscript.sed file.txt# -r, -E 使用扩展正则表达式sed-r's/[0-9]+/NUMBER/g'file.txt

替换命令详解

# s/old/new/flags# 基本替换(仅替换每行第一个匹配)echo"foo bar foo"|sed's/foo/baz/'# 输出:baz bar foo# 全局替换(替换所有匹配)echo"foo bar foo"|sed's/foo/baz/g'# 输出:baz bar baz# 替换第 N 个匹配echo"aaa"|sed's/a/b/2'# 输出:aba(仅替换第2个)# 使用不同的分隔符(适合路径替换)sed's|/old/path|/new/path|g'file.txt# 使用 & 引用匹配内容echo"hello world"|sed's/[a-z]*/[&]/'# 输出:[hello] world# 使用 \1, \2 引用捕获组echo"2024-01-10"|sed-r's/([0-9]+)-([0-9]+)-([0-9]+)/\2\/\3\/\1/'# 输出:01/10/2024# 忽略大小写替换echo"Hello HELLO"|sed's/hello/world/gi'# 输出:world world

删除命令

# d 命令:删除匹配的行# 删除空行sed'/^$/d'file.txt# 删除注释行sed'/^#/d'file.txt# 删除包含特定字符串的行sed'/pattern/d'file.txt# 删除第 5 行sed'5d'file.txt# 删除第 1-5 行sed'1,5d'file.txt# 删除最后一行sed'$d'file.txt# 删除从匹配到文件末尾的行sed'/pattern/,$d'file.txt# 删除所有空行和注释行sed-e'/^$/d'-e'/^#/d'file.txt

打印命令

# p 命令:打印匹配的行(通常与 -n 配合)# 打印包含 pattern 的行sed-n'/pattern/p'file.txt# 打印第 5 行sed-n'5p'file.txt# 打印第 1-5 行sed-n'1,5p'file.txt# 打印最后一行sed-n'$p'file.txt# 打印从匹配行到文件末尾sed-n'/pattern/,$p'file.txt# 打印行号sed-n'/pattern/='file.txt

插入和追加命令

# a 命令:在匹配行后追加# 在第 3 行后追加文本sed'3a\This is a new line'file.txt# 在匹配行后追加sed'/pattern/a\New line after pattern'file.txt# i 命令:在匹配行前插入# 在第 3 行前插入文本sed'3i\This is inserted before line 3'file.txt# c 命令:替换整行sed'/pattern/c\This replaces the entire line'file.txt

实际应用示例

# === 示例1:修改配置文件 ===# 修改 SSH 端口sudosed-i's/^#Port 22/Port 2222/'/etc/ssh/sshd_config# 禁用 root 登录sudosed-i's/^PermitRootLogin yes/PermitRootLogin no/'/etc/ssh/sshd_config# === 示例2:批量替换文件中的字符串 ===# 将所有 .txt 文件中的 "old_name" 替换为 "new_name"sed-i's/old_name/new_name/g'*.txt# === 示例3:删除 HTML 标签 ===sed's/<[^>]*>//g'index.html# === 示例4:提取特定列 ===# 从 /etc/passwd 提取用户名和 Shellsed-r's/^([^:]+):([^:]*:){5}([^:]+).*/\1 -> \3/'/etc/passwd# === 示例5:在文件开头添加内容 ===sed-i'1i\#!/bin/bash'script.sh# === 示例6:去除行尾空格 ===sed-i's/[[:space:]]*$//'file.txt# === 示例7:多行替换 ===# 删除 C 风格注释 /* ... */sed'/\/\*/,/\*\//d'file.c# === 示例8:删除 Windows 行尾的 \r ===sed-i's/\r$//'file.txt

⚠️ 危险操作警告与回滚

# ⚠️ 危险操作:sed -i 不加备份sed-i's/old/new/g'important_file.txt# 如果替换错误,原文件已被修改,无法恢复# ✅ 安全做法1:先备份sed-i.bak's/old/new/g'important_file.txt# 会创建 important_file.txt.bak 备份# ✅ 安全做法2:先用 -n 预览sed-n's/old/new/gp'important_file.txt# 仅显示被替换的行# ✅ 安全做法3:先输出到新文件sed's/old/new/g'important_file.txt>important_file_new.txt# 确认无误后再替换mvimportant_file_new.txt important_file.txt# 回滚方案# 如果使用了 -i.bak,可以从备份恢复cpimportant_file.txt.bak important_file.txt

sed 与其他工具对比

# === 简单替换:sed 最方便 ===sed's/old/new/g'file.txt# === 复杂文本处理:awk 更灵活 ===awk'{gsub(/old/, "new"); print}'file.txt# === 多文件替换:使用 find + sed ===find.-name"*.txt"-execsed-i's/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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询