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
选项的替代命令之外,所有内容都与前面的示例相同。
H
、x
和 p
命令的作用与以前相同。 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