與其他編程語言一樣,SED也提供了循環(huán)和分支函數(shù)來控制執(zhí)行流程。在本章中,我們將探索更多有關(guān)如何在SED中使用循環(huán)和分支的信息。
SED中的循環(huán)的工作方式類似于 goto 語句。 SED可以跳到標(biāo)簽所標(biāo)簽的行,然后繼續(xù)執(zhí)行其余命令。在SED中,我們可以如下定義 label :
:label :start :end :up
在上面的示例中,冒號(hào)(:)之后的名稱表示標(biāo)語法稱。
要跳轉(zhuǎn)到特定標(biāo)簽,我們可以使用 b 命令,后跟標(biāo)語法稱。如果省略標(biāo)語法稱,則SED跳至SED文件的末尾。
讓我們編寫一個(gè)簡單的SED腳本來了解循環(huán)和分支。在我們的books.txt文件中,有幾本書名及其作者的條目。下面的示例將書名及其作者名稱合并在一行中,并用逗號(hào)分隔。然后搜索模式" Paulo"。如果該模式匹配,則在該行的前面打印一個(gè)連字符(-),否則它將跳轉(zhuǎn)到 Print 標(biāo)簽,該標(biāo)簽將打印該行。
$sed -n ' h;n;H;x s/\n/,/ /Paulo/!b Print s/^/-/ :Print p' books.txt
執(zhí)行上述代碼后,您將得到以下輸出
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
為了提高可讀性,每個(gè)SED命令都放在單獨(dú)的行上。但是,可以選擇將所有命令放在一行中,如下所示
$sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;p' books.txt
執(zhí)行上述代碼后,您將得到以下輸出
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