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; 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