1. 核心概念与解剖

 

定义:Stream Editor(流编辑器)。

机制:sed 维护一个“模式空间 (Pattern Space)”。它按行读取文件,将当前行放入空间,执行命令,输出结果,然后清空空间读取下一行。

 

标准语法结构

 


 

2. 常用选项 (Options) - 决定 sed 的行为

 

选项英文全称解释典型场景
-i--in-place直接修改原文件。默认 sed 只是输出到屏幕。修改配置文件
-n--quiet静默模式。关闭默认输出,通常配合 p 动作使用。提取特定行
-E--regexp-extended启用扩展正则。使用 +, ?, `,()` 时无需转义。
-e--expression多点编辑。允许在一个命令中执行多个脚本。一次做多件事

⚠️ 安全警告 (macOS vs Linux)

  • Linux: sed -i 's/a/b/' file
  • macOS: 强制要求备份后缀。若不备份必须传空:sed -i '' 's/a/b/' file
  • 通用安全写法: sed -i.bak 's/a/b/' file (修改前自动创建 file.bak)

 

3. 定位 (Address) - 告诉 sed 操作哪一行

 

sed 的强大之处在于精准定位。

 

3.1 数字定位

 

3.2 正则定位

 

 

3.3 区间定位 (非常强大)

语法:'/开始标记/,/结束标记/ 动作'

 


 

4. 替换命令 (Substitute) - s

 

语法:s/正则/新内容/标记

 

4.1 基础替换

 

 

4.2 分隔符陷阱

当你要替换路径(包含 /)时,使用 / 作为分隔符会非常痛苦(需要疯狂转义 \/)。

技巧: sed 允许你用任何字符作为分隔符,常用 #, @, |。

 

 

4.3 高级替换:后向引用 (Back References)

这是 sed 最核心的高级功能。使用 () 捕获内容,用 \1, \2 引用它。

强烈建议配合 -E 使用。

案例 A:调整词序

将 "Hello World" 换成 "World Hello"

 

案例 B:保留部分,修改部分

比如:image: nginx:1.19 -> image: nginx:latest,但你只知道它以 image: nginx: 开头。

 

 

4.4 神奇的 & 符号

& 代表“匹配到的整个查找串”

案例:给所有 "Failed" 单词加上中括号

 


 

5. 增删改查 (CRUD 操作)

 

动作含义示例
dDelete (删除)sed '/DEBUG/d' config (删包含 DEBUG 的行)
pPrint (打印)sed -n '/Error/p' log (只打包含 Error 的行)
aAppend (行后追加)sed '1a Hello' file (在第1行面加一行)
iInsert (行前插入)sed '/root/i #User' file (在匹配行面加一行)
cChange (整行替换)sed '/SELINUX=/c SELINUX=disabled' config

多行追加技巧:

在追加的内容中使用 \n 换行。

 


 

6. 实战场景 (Cookbook)

 

场景 1:修改配置文件中的 Key-Value

目标:把 nginx.conf 中的 worker_processes 1; 改为 worker_processes auto;

 

 

场景 2:删除文件中的所有空行和注释行

这是清理配置文件的标准操作。

 

 

场景 3:取 IP 地址 (配合管道)

ip addr 命令中提取 IP。

 

 

场景 4:给每一行前面添加行号

虽然 cat -n 可以做,但用 sed 也可以。

 


 

7. 避坑与变量引用

 

Shell 变量引用

 

这是新手最容易犯错的地方。

 

 

贪婪匹配

 

正则默认是贪婪的(尽可能多匹配)。

文本:粗体普通又粗体

命令:sed 's/.*<\/b>//g'

结果: (全被删了,因为 .* 直接匹配到了最后一个 )

解决: sed 不支持非贪婪修饰符 .*? (Perl/Python 支持)。在 sed 中需要变通: