• 本页内容

45. 将保持空间追加到模式空间(G 命令)


大写 G 将保持空间的内容附加到模式空间并换行。模式空间中先前的内容不会被覆盖。 相反,通过在末尾添加新行,将保持空间中的内容附加到模式空间中的现有内容。

Gg 的关系与 Hh 的关系相同。小写版本替换内容,而大写版本附加到内容。

假设模式空间包含 "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