流編輯器 - 迴圈



像其他程式語言一樣,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;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
廣告