Sed-pattern-buffer

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

ストリームエディター-パターンバッファー

ファイルに対して実行する基本的な操作の1つは、その内容を表示することです。 この目的のために、パターンバッファの内容を出力する print コマンドを使用できます。 それでは、パターンバッファについて詳しく学びましょう。

最初に、行番号、本の名前、著者、およびページ数を含むファイルを作成します。 このチュートリアルでは、このファイルを使用します。 都合に応じて任意のテキストファイルを使用できます。 テキストファイルは次のようになります。

[jerry]$ vi books.txt
1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho,288
6) A Game of Thrones, George R. R. Martin, 864

次に、ファイルの内容を印刷します。

[jerry]$ sed 'p' books.txt

上記のコードが実行されると、次の結果が生成されます。

1) A Storm of Swords, George R. R. Martin, 1216
1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864
6) A Game of Thrones, George R. R. Martin, 864

各行がなぜ2回表示されるのか疑問に思うかもしれません。 調べてみましょう。

SEDのワークフローを覚えていますか? デフォルトでは、SEDはパターンバッファの内容を出力します。 さらに、コマンドセクションに明示的に印刷コマンドを含めました。 したがって、各行は2回印刷されます。 でも心配しないで。 SEDには、パターンバッファのデフォルト印刷を抑制する -n オプションがあります。 次のコマンドはそれを示しています。

[jerry]$ sed -n 'p' books.txt

上記のコードが実行されると、次の結果が生成されます。

1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864

おめでとうございます。 期待どおりの結果が得られました。 デフォルトでは、SEDはすべての回線で動作します。 ただし、特定の回線でのみSEDを動作させることができます。 たとえば、次の例では、SEDは3行目でのみ動作します。 この例では、SEDコマンドの前にアドレス範囲を指定しています。

[jerry]$ sed -n '3p' books.txt

上記のコードが実行されると、次の結果が生成されます。

3) The Alchemist, Paulo Coelho, 197

さらに、特定の行のみを印刷するようにSEDに指示することもできます。 たとえば、次のコードは2〜5のすべての行を出力します。 ここでは、コンマ(、)演算子を使用してアドレス範囲を指定しました。

[jerry]$ sed -n '2,5 p' books.txt

上記のコードが実行されると、次の結果が生成されます。

2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288

また、ファイルの最後の行を表す特殊文字Dollar($)もあります。 それでは、ファイルの最後の行を印刷しましょう。

[jerry]$ sed -n '$ p' books.txt

上記のコードが実行されると、次の結果が生成されます。

6) A Game of Thrones, George R. R. Martin, 864

ただし、ドル($)文字を使用してアドレス範囲を指定することもできます。 以下の例は、3行目から最後の行までを出力します。

[jerry]$ sed -n '3,$ p' books.txt

上記のコードが実行されると、次の結果が生成されます。

3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

コンマ(、)演算子を使用してアドレス範囲を指定する方法を学びました。 SEDは、アドレス範囲の指定に使用できるさらに2つの演算子をサポートします。 最初はplus()演算子で、コンマ(、)演算子と共に使用できます。 たとえば、 *M、 n* は、行番号 M から始まる次の n 行を出力します。 分かりにくいですね。 簡単な例で確認しましょう。 次の例では、行番号2から始まる次の4行を出力します。

[jerry]$ sed -n '2,+4 p' books.txt

上記のコードが実行されると、次の結果が生成されます。

2) The Two Towers, J. R. R. Tolkien, 352
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864

オプションで、チルダ(〜)演算子を使用してアドレス範囲を指定することもできます。 M〜n 形式を使用します。 これは、SEDが行番号Mで始まり、n(th)行ごとに処理する必要があることを示しています。 たとえば、 50〜5 は行番号50、55、60、65などに一致します。 ファイルから奇数行のみを印刷してみましょう。

[jerry]$ sed -n '1~2 p' books.txt

上記のコードが実行されると、次の結果が生成されます。

1) A Storm of Swords, George R. R. Martin, 1216
3) The Alchemist, Paulo Coelho, 197
5) The Pilgrimage, Paulo Coelho, 288

次のコードは、ファイルの偶数行のみを出力します。

[jerry]$ sed -n '2~2 p' books.txt

上記のコードが実行されると、次の結果が生成されます。

2) The Two Towers, J. R. R. Tolkien, 352
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
6) A Game of Thrones, George R. R. Martin, 864