分号可将多个sed命令串行作用于每一行输入:前一命令修改后,后一命令立即处理更新后的结果。支持替换、删除、打印等混合命令,均在当前行模式空间内执行,不跨行;-e选项与分号写法等效。

可以用分号(;)把多个 sed 替换命令写在同一行,让它们按顺序依次作用于**每一行输入**。这不是“同时执行”,而是“串行处理”:前一个命令改完后,后一个命令接着处理该行的最新结果。
分号组合的基本写法
语法很简单:在单引号内用分号分隔各命令,中间不加空格也可(但加空格更易读):
-
sed 's/abc/def/; s/123/456/' file.txt—— 先把每行中第一个abc换成def,再把结果中第一个123换成456 - 支持混合类型命令:替换、删除、打印可混用,例如
sed '/error/s/^/#/; /warning/d' log.txt—— 对含error的行开头加#,再删掉所有含warning的行
注意命令作用范围是“当前行”
分号连接的命令都运行在同一个模式空间(即当前正在处理的那行),所以后序命令能看到前序命令的修改结果:
- 比如
sed 's/a/x/; s/x/y/'会把a变成y(先变x,再变y) - 但
sed 's/a/b/; s/c/d/'不会影响彼此,除非前一步生成了后一步的匹配内容 - 它不会跨行操作——想跨行处理得用
N、H等高级命令
和 -e 选项效果等价
写成 sed -e 's/a/b/' -e 's/c/d/' file 和 sed 's/a/b/; s/c/d/' file 完全等效。分号写法更紧凑;-e 更适合命令很长或需要脚本化时拆开维护。
实际常用组合示例
比如清理日志行:去掉首尾空格、把多个连续空格压成一个、再删空行:
sed 's/^[[:space:]]*//; s/[[:space:]]*$//; s/[[:space:]]\+/ /g; /^$/d' log.txt- 说明:
^[[:space:]]*匹配行首空白,[[:space:]]*$匹配行尾空白,[[:space:]]\+匹配一个及以上空白字符,/^$/d删除完全为空的行











