• 本页内容

43. 将模式空间追加到保持空间(H 命令)


大写 H 是附加模式空间以保持新行空间的命令。 保持空间之前的内容不会被覆盖。相反,通过在末尾添加新行,将模式空间的内容附加到保持空间的现有内容。

假设模式空间包含 "line 1",保持空间包含 "line 2"。 执行 H 命令后,模式空间没有改变,仍然有 "line 1",但保持空间将有 "line 2\nline 1"

打印经理的姓名和职务(单独的行):

$ sed -n -e '/Manager/!h' -e '/Manager/{H;x;p}' empnametitle.txt
Jason Smith
IT Manager
Jane Miller
Sales Manager

在上面的例子中:

  • /Manager/!h —— 如果模式空间的内容不包含 "Manager"(模式后面的!表示 "不等于" 模式),则将模式空间的内容复制到保持空间。 (在本例中,这可能是员工名称(或)不是 "Manager" 的头衔。)这与我们在命令示例中使用的命令相同。

  • /Manager/{H;x;p} —— 如果模式空间的内容包含关键字 "Manager"H 命令将追加模式空间(即 Manager)以保存带有新行的空间。 因此,此阶段的保持空间将具有 "Employee Name\nTitle"(其中包含关键字 Manager)。 x 命令将保持空间交换回模式空间,p 打印模式空间。

您还可以将其保存在 sed 脚本文件中并执行它,如下所示。

$ vi H-upper.sed
#!/bin/sed -nf
/Manager/!h
/Manager/{H;x;p}

$ chmod u+x H-upper.sed

$ ./H-upper.sed empnametitle.txt
Jason Smith
IT Manager
Jane Miller
Sales Manager

如果您希望将员工姓名和职位打印在同一行,并以冒号 : 作为分隔符,则可以对上面的示例稍加修改:

$ sed -n -e '/Manager/!h' -e '/Manager/{H;x;s/\n/:/;p}'
empnametitle.txt
Jason Smith:IT Manager
Jane Miller:Sales Manager

在第二个示例中,除了添加到第二个 -e 选项的替代命令之外,所有内容都与前面的示例相同。 Hxp 命令的作用与以前相同。 s 命令在交换之后但在打印之前将 \n 替换为 : 。 因此,名称和标题打印在一行上,并用冒号分隔。

您还可以将其保存在 sed 脚本文件中并执行它,如下所示。

$ vi H1-upper.sed
#!/bin/sed -nf
/Manager/!h
/Manager/{H;x;s/\n/:/;p}

$ chmod u+x H1-upper.sed

$ ./H1-upper.sed empnametitle.txt
Jason Smith:IT Manager
Jane Miller:Sales Manager