ストリームエディタ-ループ
他のプログラミング言語と同様に、SEDも実行フローを制御するためのループおよび分岐機能を提供します。この章では、SEDでループとブランチを使用する方法について詳しく説明します。
SEDのループは、 gotoステートメント。SEDは、ラベルでマークされた行にジャンプして、残りのコマンドの実行を続行できます。SEDでは、label 次のように:
:label
:start
:end
:up
上記の例では、colon(:)の後の名前は、ラベル名を意味します。
特定のラベルにジャンプするには、 bコマンドの後にラベル名が続きます。ラベル名を省略すると、SEDはSEDファイルの最後にジャンプします。
ループとブランチを理解するための簡単なSEDスクリプトを書いてみましょう。books.txtファイルには、本のタイトルとその著者のエントリがいくつかあります。次の例では、本のタイトルと著者名を1行にコンマで区切って組み合わせています。次に、パターン「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
一見、上記のスクリプトは不可解に見えるかもしれません。これをわかりやすく説明しましょう。
最初の2つのコマンドは自明です h;n;H;x そして s/\n/, / 書籍のタイトルと著者をコンマ(、)で区切って組み合わせます。
3番目のコマンドはラベルにジャンプします Print パターンが一致しない場合のみ、それ以外の場合は4番目のコマンドによって置換が実行されます。
:Print は単なるラベル名であり、ご存知のとおり、 p 印刷コマンドです。
読みやすさを向上させるために、各SEDコマンドは別々の行に配置されます。ただし、次のように、すべてのコマンドを1行に配置することを選択できます。
[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