Sed-loops

提供:Dev Guides
移動先:案内検索

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

他のプログラミング言語と同様に、SEDも実行の流れを制御するループおよび分岐機能を提供します。 この章では、SEDでループとブランチを使用する方法について詳しく説明します。

SEDのループは、 goto ステートメントと同様に機能します。 SEDは、ラベルでマークされた行にジャンプして、残りのコマンドの実行を続行できます。 SEDでは、次のように label を定義できます。

:label
:start
:end
:up

上記の例では、コロン(:)の後の名前はラベル名を意味します。

特定のラベルにジャンプするには、 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; xs/\ 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