流编辑器 - 循环

与其他编程语言一样,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/,/将书名和作者用逗号(,)分隔.

  • 第三个命令仅在模式不匹配时跳转到标签打印,否则由第四个命令执行替换.

  • :打印只是一个标签名称,如您所知, 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