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
—— 这只是标签