• sed编辑器包括3个特殊命令,用来处理多行文本:

    1. N:在数据流刘中添加下一行以创建用于处理的多行组。
    2. D:删除多行组中的单隔行。
    3. P:打印多行组中的单隔行。
  • next命令,小写n命令使sed移动到数据流中文本的下一行。

  • 单行next命令移动数据流文本的下一行进入sed编辑器的处理空间(模式空间)。next命令的多行版本(N)将下一行添加到已经存在与模式空间的文本中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
        $cat data
        The first meeting of the Linux System
        Administrator's group will be held on Tuesday.
        All System Adminstrators should attend this meeting .
        Thank you for your attendance
        $sed '
        > N
        > s/System Administrator/Desktop Users/
        > ' data
        The first meeting of the Linux System Administrator's group will be held on Tuesday.
        All System Administrator should attend this meeting.
        Thank you for your attendance.
        #通过使用N命令将下一行合并到找到第一个单词的行,可以探测到跨行的短语。(问题:到达数据流最后一行,N命令不能找到匹配的数据。)
  • 多行删除命令(D),它只删除模式空间中的第一行。它将删除直至换行符的所有字符:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
        $cat data
        The first meeting of the Linux System
        Administrator's group will be held on Tuesday.
        All System Adminstrators should attend this meeting 
        $sed '
        > N
        > /System\nAdministrator/D
        > ' data
        Administrator's group will be held on Tuesday.
        All System Administrators  should attend this meeting.
    
  • 多行打印命令(P),只打印多行模式空间中的第一行。包括直至模式空间中换行字符的所有字符。

     $cat data
     The first meeting of the Linux System
     Administrator's group will be held on Tuesday.
     All System Adminstrators should attend this meeting 
     $sed '
     > N
     > /System\nAdministrator/P
     > ' data
     The first meeting of the Linux System
    
  • 模式空间是sed一个活动的缓冲区,另一个称为保留空间的缓冲区:

    sed编辑器保留空间命令

    命令 描述 命令 描述
    h 将模式空间复制到保留空间 H 将模式空间追加到保留空间
    g 将保留空间复制到模式空间 G 将保留空间追加到模式空间
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
	$cat data2
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
	$sed -n '/first/{
> h
> p
> n
> p
> g
> p
> } ' data2
This is the first data line.
This is the second data line.
This is the first data line.
#(1)当包含单词first的行出现时,h命令将行放到保留空间中。
(2)p命令打印模式空间的内容,即仍然是第一行数据。
(3)n命令检索数据流中的下一行,将其放到模式空间。
(4)p命令打印模式空间的内容,第二行数据。
(5)g命令将保留空间的内容(第一行数据)放回到模式空间,替换当前文本。
(6)p命令打印模式空间的内容,它现在回到第一行数据。