Sed管理模式 - Sed教程

我们已经讨论了使用模式和保持缓冲区。现在我们就来探讨更多关于它们使用的例子。

n 命令

n命令打印出模式缓冲区的内容,清除模式缓冲器,读取下一行到模式缓冲区,并在其上施加命令。下面给出的是 n命令的语法。

[address1[,address2]]n

下面是一个使用它打印指定的文件的内容n命令一个简单的例子:

[jerry]$ sed 'n' books.txt

当执行上面的代码,它会列出下来的文件 books.text 内容:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

让我们考虑有n个前3个 sed命令和正经过两个sed命令如下:

Sed command #1 
Sed command #2 
Sed command #3 
n command 
Sed command #4 
Sed command #5

这里,Sed应用于前三个命令对模式缓冲存储器,清除模式缓冲器,读取下一行到模式缓冲区,然后添加在第四和第五指令就可以了。

保持缓冲器保存的数据,但用sed命令不能在保持缓冲器直接应用。因此,我们需要使保持缓冲器数据转换成模式缓冲区。Sed提供了x 命令模式和保持缓冲区的内容。下面的命令说明x命令。

让我们稍微修 改books.txt 文件。该文件包含书名其次是它们的作者名称如下:

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage 
Paulo Coelho 
A Game of Thrones 
George R. R. Martin

让我们交换两个缓冲区的内容。例如,下面的示例打印的作者只名称。

[jerry]$ sed -n 'x;n;p' books.txt

在执行上面的代码,会得到如下结果:

George R. R. Martin 
J. R. R. Tolkien 
Paulo Coelho 
J. R. R. Tolkien 
Paulo Coelho 
George R. R. Martin

让我们来了解此命令的工作原理。

  • 最初,Sed读取第一行,即A Storm of Swords入模式缓冲区中。

  • x 命令移动该行保持缓冲区。

  • n 读取下一行,即,George R. R. Martin到模式缓冲区。

  • 将控制传递到该命令后跟n打印出模式缓冲区的内容。

  • 这个过程一直重复,直到文件被读完。

现在让我们印刷,这将导致印刷书籍的标题前交换缓冲区的内容。

[jerry]$ sed -n 'x;n;x;p' books.txt

执行上面的代码,得到如下结果:

A Storm of Swords
The Two Towers
The Alchemist
The Fellowship of the Ring
The Pilgrimage
A Game of Thrones

h 命令

h命令处理保持缓冲区。从模式缓冲区,以保持它的缓冲区拷贝数据。从保持现有的缓存数据被覆盖。需要注意的是-h命令不动的数据,它只是复制数据。因此,复制的数据保持,因为它是在模式缓冲区。下面给出的是-h命令的语法。

[address1[,address2]]h

下面的命令打印标题-作家Paulo Coelho。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt

执行上面的代码,得到如下结果:

The Alchemist 
The Pilgrimage

H 命令

h命令破坏了保持缓冲器以前的内容。这并不总是可以接受的,因为有时我们需要保留的内容。为了这个目的,sed提供了通过添加一个新行,在所述端部追加的内容,以保持缓冲器为H命令。 h和H的命令之间的唯一差别是,保持缓冲器前者重写数据,而后来的数据追加到保持缓冲器。它的语法类似于这是如下的h命令:

[address1[,address2]]H

让我们再举一个例子。而不是仅打印书名这一次,打印其作者的名字了。下面的例子打印书名后面的作者姓名。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt

执行上面的代码,得到如下结果:

The Alchemist 
Paulo Coelho 
The Pilgrimage
Paulo Coelho

g 命令

我们学会了如何复制/追加模式缓冲区中的内容保存缓冲区。我们可以执行相反的功能呢?肯定是的!为了这个目的,Sed提供 g 命令其副本从保持缓冲器到模式缓冲区中的数据。而复制,从模式空间现有的数据被覆盖。下面给出了g命令的语法。

[address1[,address2]]g

让我们考虑相同的例子- 在打印的书名和作者。这一次,我们将首先打印的作者和下一行,相应的题书的名字。下面的命令打印的作者Paulo Coelho,其次是它的书名的名字。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt

执行上面的代码,会得到如下结果:

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

G 命令

同样,我们可以追加保持缓冲器中的内容到模式缓冲区。Sed提供G指令它通过添加一个新行,在末尾追加内容到图案缓冲区。它的语法是类似于g命令是如下:

[address1[,address2]]G

现在,就让我们来它打印的作者Paulo Coelho随后其书名名称前面的例子。为了达到同样的效果,请执行以下sed命令。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt

执行上面的代码,会得到如下结果:

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

可以修改上面的例子中,只需更换G指令之前,缓冲区的内容如下显示书名后面他们的作者:

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt

执行上面的代码,会得到如下结果:

The Alchemist 
Paulo Coelho 
The Pilgrimage 
Paulo Coelho