流编辑器 - 模式范围



在上一章中,我们学习了 SED 处理地址范围的方式。本章介绍了 SED 如何处理模式范围。模式范围可以是简单的文本或复杂的正则表达式。我们举个例子。以下示例打印作者保罗·科埃略的所有书籍。

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

执行以上代码后,你将获得以下结果

3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288

在以上示例中,SED 针对每一行进行操作,并且仅打印与字符串 Paulo 匹配的行。

我们还可以将模式范围与地址范围结合起来。以下示例从 Alchemist 的第一个匹配项开始打印行,一直持续到第五行。

[jerry]$ sed -n '/Alchemist/, 5 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

我们可以使用 Dollar($)字符来打印找到模式的第一个匹配项之后的所有行。以下示例查找模式 The 的第一个匹配项,然后从文件中立即打印剩余的行

[jerry]$ sed -n '/The/,$ 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 

我们还可以使用逗号(,)运算符指定多个模式范围。以下示例打印介于模式 Two 和 Pilgrimage 之间的所有行。

[jerry]$ sed -n '/Two/, /Pilgrimage/ 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

此外,我们可以在模式范围内使用加号(+)运算符。以下示例查找模式 Two 的第一个匹配项,然后打印其后的 4 行。

[jerry]$ sed -n '/Two/, +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。你始终可以通过自行尝试一些示例来了解更多信息。

广告