45. 将保持空间追加到模式空间(G 命令)
大写 G 将保持空间的内容附加到模式空间并换行。模式空间中先前的内容不会被覆盖。
相反,通过在末尾添加新行,将保持空间中的内容附加到模式空间中的现有内容。
G 和 g 的关系与 H 和 h 的关系相同。小写版本替换内容,而大写版本附加到内容。
假设模式空间包含 "line 1",保持空间包含 "line 2"。执行 G 命令后,模式空间更改为包含 "line 1\nline 2",而保持空间未更改,仍包含 "line 2"。
打印员工姓名和经理职务,以冒号分隔。
$ sed -n -e '/Manager/!h' -e '/Manager/{x;G;s/\n/:/;p}' empnametitle.txt
Jason Smith:IT Manager
Jane Miller:Sales Manager
在上面的例子中:
/Manager/!h—— 如前面的示例所示,如果模式空间的内容不包含Manager,则将模式空间复制到保存空间。/Manager/{x;G;s/\n/:/;p}—— 如果模式空间的内容包含Manager,请执行以下操作:x- 将模式空间的内容与保持空间交换。因此,存储在保持空间中的Employee Name现在将位于模式空间中,而Title将位于保持空间中。G- 将保持空间(标题)的内容附加到模式空间(员工姓名)。所以,这个阶段的模式空间将有"Employee Name\nTitle"s/\n/:/这会替换用冒号分隔"Employee Name\nTitle"的\n:p打印结果(即模式空间的内容)。-
注意:请注意,如果我们省略 x 命令,即如果我们使用 /Manager/{G;s/\n/:/;p},我们将为每个经理打印title:name而不是name:title。
您还可以将其保存在 sed 脚本文件中并执行它,如下所示。
$ vi G-upper.sed
#!/bin/sed -nf
/Manager/!h
/Manager/{x;G;s/\n/:/;p}
$ chmod u+x G-upper.sed
$ ./G-upper.sed empnametitle.txt
Jason Smith:IT Manager
Jane Miller:Sales Manager