ストリームエディター-パターンバッファー
ファイルに対して実行する基本的な操作の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はパターンバッファの内容を出力します。さらに、コマンドセクションにprintコマンドを明示的に含めました。したがって、各行は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
ただし、Dollar($)文字を使用してアドレス範囲を指定することもできます。以下の例では、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つの演算子をサポートしています。1つ目はプラス(+)演算子で、コンマ(、)演算子と一緒に使用できます。例えばM, +n 次を印刷します n 行番号から始まる行 M。紛らわしいですか?簡単な例で確認してみましょう。次の例では、行番号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