流编辑器 - 特殊字符



SED 提供两个被视为命令的特殊字符。本章阐述了这两个特殊字符的用法。

= 命令

= 命令处理行号。以下是 = 命令的语法:

[/pattern/]= 
[address1[,address2]]=

= 命令将行号及其内容写入标准输出流。以下示例对此进行了说明。

[jerry]$ sed '=' books.txt 

执行上述代码后,您将得到以下结果:

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

让我们打印前四行的行号和内容。以下命令打印带有行号的前四行,其余行不带行号。

[jerry]$ sed '1, 4=' books.txt 

执行上述代码后,您将得到以下结果:

1 
1) A Storm of Swords, George R. R. Martin, 1216 
2 
2) The Two Towers, J. R. R. Tolkien, 352 
3 
3) The Alchemist, Paulo Coelho, 197 
4 
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 在模式匹配成功时打印行号。以下示例打印包含模式“Paulo”的行号。

[jerry]$ sed '/Paulo/ =' books.txt 

执行上述代码后,您将得到以下结果:

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

你能猜到以下 SED 命令的作用吗?

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

执行上述代码后,您将得到以下结果:

6 

是的,你答对了。它计算文件中存在的总行数。让我们解释一下代码。在命令部分,我们使用了“$=”,它打印最后一行及其内容的行号。但是我们也提供了-n标志,它抑制了模式缓冲区的默认打印。因此,只显示最后一行号。

& 命令

SED 支持特殊字符 &。每当模式匹配成功时,此特殊字符都会存储匹配的模式。它通常与替换命令一起使用。让我们看看如何利用这个高效的功能。

book.txt 文件中的每一行都有编号。让我们在每一行的开头添加“书号”字样。以下示例对此进行了说明。

[jerry]$ sed 's/[[:digit:]]/Book number &/' books.txt

执行上述代码后,您将得到以下结果:

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

这个例子很简单。首先,我们搜索数字的第一次出现,也就是行号(这就是我们使用 [[:digit:]] 的原因),SED 自动将匹配的模式存储在特殊字符 & 中。在第二步中,我们在每个匹配模式之前,也就是每行之前插入“书号”字样。

让我们来看另一个例子。在 book.txt 文件中,最后一个数字表示书的页数。让我们在前面添加“页数 =”。为此,请查找数字的最后一次出现,并将其替换为“页数 = &”。这里,& 存储匹配的模式,即页数。

[jerry]$ sed 's/[[:digit:]]*$/Pages = &/' books.txt 

执行上述语法后,您将得到以下结果:

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

目前,只需记住[[:digit:]]*$ 查找数字的最后一次出现。在“正则表达式”一章中,我们将更深入地探讨正则表达式。

广告