Sedチュートリアル(4)のSedモードバッファ

6763 ワード

どのファイルにも基本的な操作を行い、その内容を表示します.この目的を達成するために、印刷モードバッファの印刷コマンドを使用することができます.このチュートリアルでは、より多くのモードバッファについて説明し、関連するモードバッファの異なる演算子を使用するファイルの内容を印刷する方法について説明します.
テキストファイルがあることを考えてみましょう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 pコマンド
Sed'p'コマンドを使用して、指定したファイルの内容を印刷します.
次は簡単なコマンドでファイルbooksを印刷します.txtの内容.
[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はモードバッファの内容を印刷します.さらに,コマンド部分printコマンドに明確にアクセスした.そのため、1行に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は一部の行でのみ使用するように強制できます.
フォーマット:[address]p、addressは指定した行です.
たとえば、次の例ではsedは3行目にのみ実行されます.この例では、sedコマンドの前のアドレス範囲を指定します.
[jerry]$ sed -n '3p' books.txt 

上のコードを実行すると、次の結果が得られます.
3) The Alchemist, Paulo Coelho, 197 

Sed commaコマンド
カンマ(,)演算子を使用して、アドレス範囲内のすべてのローを指定します.
フォーマット:[address 1],[address 2],address 1は開始行数,address 2は終了行数
次のコードは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

Sed$演算子
次のように、ドル記号$演算子を使用してファイルの最後の行を印刷できます.
[jerry]$ sed -n '$ p' books.txt 

上のコードを実行すると、次の結果が得られます.
6) A Game of Thrones, George R. R. Martin, 864 

ドル記号($)を使用してアドレス範囲を指定することもできます.
フォーマット:[address],$
次の例では、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加算演算子
sedのプラス記号(+)演算子は、カンマ(,)演算子と組み合わせて使用できます.
フォーマット:[address],+[address 2],address 1は開始行数,address 2は次の行数を表す
次の例では、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 

Sed波線演算子
波打ち記号(〜)演算子を使用してアドレス範囲を指定することもできます.M〜n形式である.これは、開始行数Mと、n(回)行毎の処理、すなわち、間隔行数を示している.
例えば、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