• 本页内容

46. 将下一行追加到模式空间(N 命令)


正如大写的 HG 追加而不是替换一样,N 命令将输入文件中的下一行追加到模式缓冲区,而不是替换当前行。

正如我们之前讨论的,小写 n 命令打印当前模式空间,清除模式空间,将输入文件中的下一行读入模式空间,并从中断处恢复命令执行。

大写的N命令不打印当前模式空间,也不清除模式空间。 相反,它在当前模式空间的末尾添加换行符 (\n),将输入文件中的下一行附加到当前模式空间,并通过执行其余的 sed 命令继续 sed 标准流程。

打印员工姓名和职务,并用冒号分隔:

$ sed -e '{N;s/\n/:/}' empnametitle.txt
John Doe:CEO
Jason Smith:IT Manager
Raj Reddy:Sysadmin
Anand Ram:Developer
Jane Miller:Sales Manager

在上面的例子中:

  • N 将新行追加到当前模式空间(其中包含员工姓名),并将输入文件中的下一行追加到当前模式空间。因此,模式空间将包含("Employee Name\nTitle")。
  • s/\n/:/ 这会替换用冒号分隔 "Employee Name\nTitle"\n

append-next-line-to-pattern-space

图 1. 上例图解

以下示例演示如何使用 N 命令在文本所在的同一行打印行号,同时打印 {[< label employee.txt >}} 中的每一行。

打印行号:

$ sed -e '=' employee.txt | sed -e '{N;s/\n/ /}'
1 101,John Doe,CEO
2 102,Jason Smith,IT Manager
3 103,Raj Reddy,Sysadmin
4 104,Anand Ram,Developer
5 105,Jane Miller,Sales Manager

正如我们在前面的示例中看到的,sed = 命令首先打印行号,然后打印原始行。

在此示例中,N 命令将 \n 添加到当前模式空间(其中包含行号),然后读取下一行并将其追加。 因此,模式空间将包含 "行号\n原始行内容"。 然后我们执行 s/\n/ / 将换行符(\n)改为空格。