• 本页内容

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