深入探索 sed 高级命令:流控制与多模式匹配
1. 高级流控制命令概述
在 sed 脚本中,正常的流控制有时需要根据特定条件进行调整。分支(b)和测试(t)命令可以帮助我们实现这一目的。这两个命令能将脚本的控制权转移到包含指定标签的行,如果未指定标签,则控制权会转移到脚本末尾。分支命令(b)是无条件转移,而测试命令(t)是条件转移,只有当替换命令改变了当前行时才会发生。
标签是由最多七个字符组成的序列(POSIX 标准允许实现自行决定是否支持更长的标签,GNU sed 支持任意长度的标签),标签行以冒号开头,且冒号和标签之间不能有空格,行尾的空格会被视为标签的一部分。在分支或测试命令中指定标签时,命令和标签之间可以有空格,但标签后面不能有空格。例如:
:mylabel
b mylabel
2. 分支命令(b)的使用
分支命令的语法为 [address]b[label]
,标签是可选的。若未提供标签,控制权将转移到脚本末尾;若提供了标签,执行将从标签所在行的下一行继续。
2.1 跳过特定行的修改
在排版脚本中,如果想避免对某些行进行修改,可以使用分支命令跳过脚本的相应部分。例如,对于由 .ES
和 .EE
宏标记的计算机生成示例内的文本不应修改,脚本可以写成:
/^\.ES/,/^\.EE/b
s/^"/``/
s/"$/''/
s/"?/''?/g
...
s/\\(em\\^"/\\(em``/g
s/"\\(em/''\\(em/g