sed通过标签(:label)与b、t命令实现跳转控制,支持循环、if/else分支及条件重处理;b无条件跳转,t仅在s成功替换后跳转,常结合n/p/d等多行命令构建状态机式逻辑。

sed 里用标签(:label)和分支命令(b、t)能跳出“逐行线性执行”的限制,实现类似 if/else、循环、跳过或重处理的逻辑。关键不是堆命令,而是靠跳转改变执行顺序。
标签定义与无条件跳转(b 命令)
标签以冒号开头,写在命令行任意位置;b 命令默认跳到脚本末尾,指定标签则跳到对应位置:
-
:start定义一个叫 start 的标签 -
/pattern/bstart匹配 pattern 就跳回 start,形成循环 -
/pattern/b不带标签,直接跳到脚本结尾,相当于“跳过后续命令”
典型用途:排除特定行、提前终止处理、构造主循环入口。
条件跳转(t 命令)只响应成功替换
t 不看匹配,只看最近一次 s 命令是否真正做了替换。替换了才跳,否则继续往下走:
-
s/old/new/; t done→ 替换成功就跳到 :done;失败就执行下一条 - 常配合多行处理使用,比如反复合并换行符直到没有可替换的 \n
- 比 b 更“谨慎”,适合需要确认操作效果再决策的场景
例如把多行连成一行:sed -E ':a; s/\n/ /; ta' —— 每次替换一个 \n,成功就再跳回去继续,直到没得替了才停。
模拟 if-else 结构
单靠 b 就能组合出分支逻辑:
- 先写判断:
/^#/{...; b end}→ 是注释行就做点事,然后跳走 - 后面放“else”部分:不满足条件的行自然落到此处执行
- 最后加
:end作为统一出口
不需要 else 关键字,靠跳转落空来隐含 else 分支。多个条件可用嵌套 b 或不同标签区分路径。
实际常用组合模式
复杂控制往往不是孤立用 b 或 t,而是配合 N、P、D 等多行命令一起工作:
- 读多行进模式空间(N),再用 t 判断是否含目标特征,决定是否继续追加
- 用 b 跳过整块不需要处理的段落(如跳过注释块或空行区)
- 用 :loop; ...; /condition/b loop 实现“只要满足条件就重复某段逻辑”
本质是把 sed 脚本当成小型状态机:每行输入触发一组动作,跳转指令改变下一步该执行哪段逻辑,而不是硬编码顺序。











