- Sed 教程
- Sed - 首页
- Sed - 概述
- Sed - 环境
- Sed - 工作流程
- Sed - 基本语法
- Sed - 循环
- Sed - 分支
- Sed - 模式缓冲区
- Sed - 模式范围
- Sed - 基本命令
- Sed - 特殊字符
- Sed - 字符串
- Sed - 模式管理
- Sed - 正则表达式
- Sed - 实用技巧
- Sed 有用资源
- Sed - 快速指南
- Sed - 有用资源
- Sed - 讨论
流编辑器 - 循环
像其他编程语言一样,SED 也提供了循环和分支功能来控制执行流程。在本章中,我们将进一步探讨如何在 SED 中使用循环和分支。
SED 中的循环类似于goto语句。SED 可以跳转到标记为标签的行,并继续执行剩余的命令。在 SED 中,我们可以定义标签如下
:label :start :end :up
在上面的例子中,冒号(:)后面的名称表示标签名称。
要跳转到特定标签,我们可以使用b命令,后跟标签名称。如果省略标签名称,则 SED 将跳转到 SED 文件的末尾。
让我们编写一个简单的 SED 脚本,以了解循环和分支。在我们的 books.txt 文件中,有几个书籍标题及其作者的条目。以下示例将书籍标题及其作者名称组合在一行中,并用逗号分隔。然后它搜索模式“Paulo”。如果模式匹配,它会在行前打印一个连字符 (-),否则它会跳转到Print标签,该标签打印该行。
[jerry]$ sed -n ' h;n;H;x s/\n/, / /Paulo/!b Print s/^/- / :Print p' 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
乍一看,上面的脚本可能看起来很神秘。让我们来揭开它。
前两个命令h;n;H;x 和 s/\n/, / 很容易理解,它们将书籍标题和作者用逗号 (,) 分隔组合在一起。
第三个命令仅在模式不匹配时跳转到标签Print,否则第四个命令执行替换。
:Print只是一个标签名称,如您所知,p是打印命令。
为了提高可读性,每个 SED 命令都放在单独一行。但是,可以选择将所有命令放在一行中,如下所示
[jerry]$ sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;p' 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
广告