ストリームエディタ-ループ

他のプログラミング言語と同様に、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