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