Sed教程(四)之Sed模式缓冲区

我们对任何文件进行基本操作,显示其内容。为了达到这个目的,我们可以用打印的模式缓冲区的打印命令。本教程将介绍更多的模式缓冲区,以及如何打印使用相关模式缓冲区不同运算符的文件的内容。

考虑一下我们有一个文本文件books.txt待处理,它有以下内容:

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

Sed p 命令

使用Sed 'p'命令来打印指定文件的内容。

下面是一个简单的命令来打印文件 books.txt 的内容。

[jerry]$ sed 'p' books.txt

当执行上面的代码,就会产生下面的结果。

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

让我们找出为什么每个行被打印两次。实际上,在默认情况下,sed打印模式缓冲区的内容。此外,我们已明确地接入命令部分 print  命令。因此,每行打印了两次。

Sed有一个-n选项来抑制模式缓冲区的默认打印。让我们试试下面的命令:

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

当执行上面的代码,就会产生下面的结果。

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 

Sed 地址范围

默认情况下,sed在所有行上操作。但是,可以强制sed只在某些行上使用。

  格式:[address]p,address为指定的行

例如,在下面的例子中,sed只运行在第三行。在这个例子中,我们指定 sed 命令前一个地址范围。

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

当执行上面的代码,就会产生下面的结果。

3) The Alchemist, Paulo Coelho, 197 

Sed comma 命令

我们使用逗号(,)运算符来指定地址范围内的所有行。

  格式:[address1],[address2],address1表示开始行数,address2表示结束行数

下面的代码打印2〜5行。

[jerry]$ sed -n '2,5 p' books.txt 

当执行上面的代码,就会产生下面的结果。

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

Sed $ 运算符

我们可以使用美元符号$运算符来打印该文件的最后一行,如下所示:

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

 当执行上面的代码,就会产生下面的结果。

6) A Game of Thrones, George R. R. Martin, 864 

我们也可以使用美元符号($)来指定一个地址范围。

  格式:[address], $

下面的例子打印通过第3行到最后一行。

[jerry]$ sed -n '3,$ p' books.txt 

当执行上面的代码,就会产生下面的结果。

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

Sed 加运算符

sed的加号(+)运算符可以与逗号(,)运算符搭配使用。

  格式:[address], + [address2], address1表示开始行数,address2表示下一个行数

以下示例打印从第2行开始到下一个4行:

[jerry]$ sed -n '2,+4 p' books.txt 

当执行上面的代码,就会产生下面的结果。

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 

Sed 波浪线运算符

我们也可以使用波浪符号(〜)运算符指定地址范围。它采用M〜n形式。这表明开始行数M和处理每n(次)行,即间隔行数。

例如,50〜5行号50,55,60,65,等等。让我们从打印的文件只有奇数行。

[jerry]$ sed -n '1~2 p' books.txt 

当执行上面的代码,就会产生下面的结果。

1) A Storm of Swords, George R. R. Martin, 1216 
3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288

下面的代码仅打印偶数行的文件。

[jerry]$ sed -n '2~2 p' books.txt 

当执行上面的代码,就会产生下面的结果。

2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864 
posted @ 2016-02-15 16:31  天堂小说  阅读(606)  评论(0编辑  收藏  举报