46. 将下一行追加到模式空间(N 命令)
正如大写的 H 和 G 追加而不是替换一样,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:
图 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)改为空格。