ストリームエディタ-パターンの管理

パターンとホールドバッファの使用についてはすでに説明しました。この章では、それらの使用法について詳しく説明します。議論しましょうnパターンスペースを出力するコマンド。他のコマンドと組み合わせて使用​​されます。以下に、thenコマンドの構文を示します。

[address1[,address2]]n

例を見てみましょう。

[jerry]$ sed 'n' 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

ザ・ n commandは、パターンバッファーの内容を出力し、パターンバッファーをクリアし、次の行をパターンバッファーにフェッチして、コマンドを適用します。

前に3つのSEDコマンドがあると考えてみましょう n および後の2つのSEDコマンド n 次のように:

Sed command #1 
Sed command #2 
Sed command #3 
n command 
Sed command #4 
Sed command #5

この場合、SEDは最初の3つのコマンドをパターンバッファに適用し、パターンバッファをクリアし、次の行をパターンバッファにフェッチしてから、4番目と5番目のコマンドを適用します。これは非常に重要な概念です。これを明確に理解せずに先に進まないでください。

ホールドバッファはデータを保持しますが、SEDコマンドをホールドバッファに直接適用することはできません。したがって、ホールドバッファデータをパターンバッファに取り込む必要があります。SEDはxパターンの内容を交換し、バッファを保持するコマンド。次のコマンドは、x コマンド。

books.txtファイルを少し変更してみましょう。たとえば、ファイルには本のタイトルとそれに続く著者名が含まれています。変更後、ファイルは次のようになります。

[jerry]$ cat 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つのバッファの内容を交換しましょう。たとえば、次の例では、作成者の名前のみを出力します。

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

上記のコードを実行すると、次の結果が得られます。

George R. R. Martin 
J. R. R. Tolkien 
Paulo Coelho 
J. R. R. Tolkien 
Paulo Coelho 
George R. R. Martin

このコマンドがどのように機能するかを理解しましょう。

  • 最初に、SEDは最初の行、つまりA Storm ofSwordsをパターンバッファーに読み込みます。

  • x コマンドは、この行を保留バッファーに移動します。

  • n 次の行、つまりGeorge RRMartinをパターンバッファにフェッチします。

  • コントロールはコマンドに渡され、その後にnが続き、パターンバッファーの内容が出力されます。

  • このプロセスは、ファイルが使い果たされるまで繰り返されます。

印刷する前に、バッファの内容を交換しましょう。どうなると思いますか?はい、本のタイトルを印刷します。

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

上記のコードを実行すると、次の結果が得られます。

A Storm of Swords 
The Two Towers 
The Alchemist 
The Fellowship of the Ring 
The Pilgrimage 
A Game of Thrones

ザ・ hコマンドはホールドバッファを扱います。パターンバッファからホールドバッファにデータをコピーします。ホールドバッファからの既存のデータは上書きされます。注意してくださいhコマンドはデータを移動せず、データをコピーするだけです。したがって、コピーされたデータはパターンバッファにそのまま残ります。以下に示すのは、h コマンド。

[address1[,address2]]h

次のコマンドは、著者PauloCoelhoのタイトルのみを出力します。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt

上記のコードを実行すると、次の結果が得られます。

The Alchemist 
The Pilgrimage

上記のコマンドがどのように機能するかを理解しましょう。books.txtの内容は特定の形式に従います。最初の行は本のタイトルで、その後に本の著者が続きます。上記のコマンドでは、「!」条件を逆にするために使用されます。つまり、パターンマッチングが成功しなかった場合にのみ、行がホールドバッファにコピーされます。また、中括弧{}は、複数のSEDコマンドをグループ化するために使用されます

コマンドの最初のパスで、SEDは最初の行、つまりA Storm of Swordsをパターンバッファーに読み込み、パターンPauloが含まれているかどうかを確認します。パターンマッチングが成功しないため、この行をホールドバッファにコピーします。これで、パターンバッファとホールドバッファの両方に同じ行、つまりA Storm ofSwordsが含まれます。2番目のステップでは、行にパターンPauloが含まれているかどうかを確認します。パターンが一致しないため、何もしません。

2番目のパスでは、次の行のGeorge RR Martinをパターンバッファに読み込み、同じ手順を適用します。次の3行については、同じことを行います。5回目のパスの終わりに、両方のバッファーに錬金術師が含まれます。6番目のパスの開始時に、Paulo Coelhoの行を読み取り、パターンが一致すると、この行をホールドバッファーにコピーしません。したがって、パターンバッファにはPaulo Coelhoが含まれ、ホールドバッファにはTheAlchemistが含まれます。

その後、パターンバッファにパターンPauloが含まれているかどうかをチェックします。パターンマッチングが成功すると、パターンバッファの内容がホールドバッファと交換されます。これで、パターンバッファーにはアルケミストが含まれ、ホールドバッファーにはパウロコエーリョが含まれます。最後に、パターンバッファの内容を出力します。同じ手順がパターンThePilgrimageに適用されます。

ザ・ hコマンドは、ホールドバッファの以前の内容を破棄します。内容を保存する必要がある場合があるため、これは常に受け入れられるとは限りません。この目的のために、SEDはH最後に改行を追加して、内容をホールドバッファに追加するコマンド。の唯一の違いh そして Hコマンドは、前者はホールドバッファからのデータを上書きし、後者はホールドバッファにデータを追加します。その構文はに似ていますh コマンド。

[address1[,address2]]H

別の例を見てみましょう。今回は、本のタイトルだけを印刷するのではなく、著者の名前も印刷します。次の例では、本のタイトルの後に著者名を印刷します。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt

上記のコードを実行すると、次の結果が得られます。

The Alchemist 
Paulo Coelho 
The Pilgrimage
Paulo Coelho

パターンバッファの内容をコピー/追加してバッファを保持する方法を学びました。逆関数も実行できますか?はい、確かに!この目的のために、SEDはgホールドバッファからパターンバッファにデータをコピーするコマンド。コピー中に、パターン空間からの既存のデータが上書きされます。以下に示すのは、g コマンド。

[address1[,address2]]g

同じ例を考えてみましょう-本のタイトルとその著者を印刷します。今回は、最初に著者の名前を印刷し、次の行に対応する本のタイトルを印刷します。次のコマンドは、著者Paulo Coelhoの名前と、それに続く本のタイトルを出力します。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt

上記のコードを実行すると、次の結果が得られます。

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

最初のコマンドはそのまま保持されます。5回目のパスの終わりに、両方のバッファーに錬金術師が含まれます。6番目のパスの開始時に、Paulo Coelhoの行を読み取り、パターンが一致すると、この行をホールドバッファーにコピーしません。したがって、パターンスペースにはPaulo Coelhoが含まれ、ホールドスペースにはTheAlchemistが含まれます。

その後、パターン空間にパターンPauloが含まれているかどうかをチェックします。パターンマッチングが成功すると、最初にパターンスペースの内容、つまりPaulo Coelhoが出力され、次にホールドバッファがパターンバッファにコピーされます。したがって、パターンバッファとホールドバッファの両方にアルケミストが含まれています。最後に、パターンバッファの内容を出力します。同じ手順がパターンThePilgrimageに適用されます。

同様に、ホールドバッファの内容をパターンバッファに追加することができます。SEDはG 最後に改行を追加して、パターンバッファに内容を追加するコマンド。

[address1[,address2]]G

ここで、著者の名前PauloCoelhofollowedに本のタイトルを付けた前の例を見てみましょう。同じ結果を得るには、次のSEDコマンドを実行します。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt

上記のコードを実行すると、次の結果が得られます。

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

上記の例を変更して、本のタイトルの後に著者が続くように表示できますか?簡単です。バッファの内容を交換するだけで、G コマンド。

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt

上記のコードを実行すると、次の結果が得られます。

The Alchemist 
Paulo Coelho 
The Pilgrimage 
Paulo Coelho