📜  流编辑器-循环

📅  最后修改于: 2020-10-16 06:12:58             🧑  作者: Mango


与其他编程语言一样,SED也提供了循环和分支功能来控制执行流程。在本章中,我们将探索更多有关如何在SED中使用循环和分支的信息。

SED中的循环工作类似于goto语句。 SED可以跳到标签所标记的行,然后继续执行其余命令。在SED中,我们可以如下定义标签

:label 
:start 
:end 
:up

在上面的示例中,冒号(:)之后的名称表示标签名称。

要跳转到特定标签,我们可以使用b命令,后跟标签名称。如果省略标签名称,则SED跳至SED文件的末尾。

让我们编写一个简单的SED脚本来了解循环和分支。在我们的books.txt文件中,有几本书名及其作者的条目。下面的示例将书名及其作者名称合并在一行中,并用逗号分隔。然后搜索模式“ Paulo”。如果模式匹配,它将在该行的前面打印一个连字符(-),否则它将跳转到打印该行的打印标签。

[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; xs / \ 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