Sed 模式范围
Sed - 使用模式和范围进行寻址
Section titled “Sed - 使用模式和范围进行寻址”在 sed 中,命令可以被限制为仅对匹配特定地址或地址范围的行进行操作。地址可以是行号、模式(正则表达式),或两者的组合。本章重点介绍如何使用模式来定义这些范围。记住,默认情况下,sed 在处理后会打印每一行。-n 选项会抑制此默认输出,而 p 命令会显式打印行。
单一模式寻址
Section titled “单一模式寻址”你可以指定一个单一模式。sed 将把命令应用于任何匹配此模式的行。模式用斜杠(/pattern/)括起来。
**示例:**从 books.txt 文件中打印包含字符串 “Paulo” 的行。
假设 books.txt 包含以下行:
3) The Alchemist, Paulo Coelho, 197
5) The Pilgrimage, Paulo Coelho, 288
$ sed -n '/Paulo/ p' books.txt输出:
3) The Alchemist, Paulo Coelho, 1975) The Pilgrimage, Paulo Coelho, 288在这里,sed 处理 books.txt 的每一行。如果某行包含 “Paulo”,则对该行执行 p 命令,将其打印出来。
模式与行号范围
Section titled “模式与行号范围”你可以将模式与行号结合来定义范围。范围 /pattern/,lineNumber 从匹配 pattern 的第一行开始,持续到(并包括)lineNumber。
**示例:**打印从包含 “Alchemist” 的第一行开始,直到第 5 行的行。
$ sed -n '/Alchemist/,5 p' books.txt假设 books.txt 包含相关内容,输出可能如下:
3) The Alchemist, Paulo Coelho, 1974) The Fellowship of the Ring, J. R. R. Tolkien, 4325) The Pilgrimage, Paulo Coelho, 288模式到文件尾的范围
Section titled “模式到文件尾的范围”你可以使用 $ 字符(代表输入的最后一行)来定义从模式匹配开始到文件末尾的范围。
**示例:**打印从第一次出现 “The” 的行开始到 books.txt 末尾的所有行。
$ sed -n '/The/,$ p' books.txt输出(示例):
2) The Two Towers, J. R. R. Tolkien, 3523) The Alchemist, Paulo Coelho, 1974) The Fellowship of the Ring, J. R. R. Tolkien, 4325) The Pilgrimage, Paulo Coelho, 2886) A Game of Thrones, George R. R. Martin, 864两个模式之间的范围
Section titled “两个模式之间的范围”你可以指定由两个模式定义的范围:/pattern1/,/pattern2/。sed 将从匹配 pattern1 的第一行开始应用命令,并持续到找到匹配 pattern2 的行为止。如果在 pattern1 之后未找到 pattern2,则会持续到文件末尾。
**示例:**打印从包含 “Two” 的行开始,直到包含 “Pilgrimage” 的行的所有行。
$ sed -n '/Two/,/Pilgrimage/ p' books.txt输出(示例):
2) The Two Towers, J. R. R. Tolkien, 3523) The Alchemist, Paulo Coelho, 1974) The Fellowship of the Ring, J. R. R. Tolkien, 4325) The Pilgrimage, Paulo Coelho, 288模式与相对行数(GNU sed 扩展)
Section titled “模式与相对行数(GNU sed 扩展)”GNU sed 允许使用 /pattern/,+N 语法指定从模式匹配开始加上若干后续行的范围。这意味着匹配 pattern 的行以及接下来的 N 行。
**示例:**找到包含 “Two” 的第一行,并打印该行以及接下来的 4 行。
$ sed -n '/Two/,+4 p' books.txt输出(示例):
2) The Two Towers, J. R. R. Tolkien, 3523) The Alchemist, Paulo Coelho, 1974) The Fellowship of the Ring, J. R. R. Tolkien, 4325) The Pilgrimage, Paulo Coelho, 2886) A Game of Thrones, George R. R. Martin, 864**关于正则表达式的说明:**这些示例中使用的模式是简单字符串。然而,sed 模式默认实际上是基本正则表达式,允许进行更复杂的匹配。例如,/^Start/ 匹配出现在行首的 “Start”。你可以使用 -E(或 GNU sed 中的 -r)选项启用扩展正则表达式,用于更复杂的模式。
实践出真知,实验是掌握 sed 寻址能力的关键。尝试使用你自己的文本文件运行这些示例,并修改模式和范围,观察不同的结果。