50. 使用 t 命令循环
仅当前一个替换命令成功时,sed 命令 t label 才会将执行流分支到该标签。
也就是说,当前面的替换成功时,sed 跳转到标签标记的行并继续从那里执行其余命令,否则继续正常执行流程。
以下示例将员工姓名和职务(来自 empnametitle.txt 文件)组合到字段之间以 : 分隔的单行中,并且当该员工的职务包含关键字 "Manager" 时,还在员工姓名前面添加三个 "*" 。
s/^/***/(而不是 s/^/*/)来实现相同的结果。给出此示例只是为了解释 sed t 命令的工作原理。
$ vi label-t.sed #!/bin/sed -nf h;n;H;x s/\n/:/ :repeat /Manager/s/^/*/ /\*\*\*/!t repeat p $ chmod u+x label-t.sed $ ./label-t.sed empnametitle.txt John Doe:CEO ***Jason Smith:IT Manager Raj Reddy:Sysadmin Anand Ram:Developer ***Jane Miller:Sales Manager
在上面的例子中:
- 以下代码片段执行循环。
:repeat /Manager/s/^/*/ /\*\*\*/!t repeat
/Manager/s/^/*/—— 如果是Manager,则会在行前添加一个*。/\*\*\*/!t repeat—— 如果该行不包含三个*(由/\*\*\*/!表示),并且如果上一个替换命令成功通过在该行前面添加一个*。 sed 跳转到称为repeat的标签(这由t repeat表示):repeat—— 这只是标签