Sed - 循环

  • 简述

    与其他编程语言一样,SED 也提供了循环和分支工具来控制执行流程。在本章中,我们将进一步探讨如何在 SED 中使用循环和分支。
    SED 中的循环类似于goto陈述。SED 可以跳转到标签标记的行并继续执行剩余的命令。在 SED 中,我们可以定义一个label如下:
    
    :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;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