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
)改为空格。