Sed-basic-commands

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

ストリームエディター-基本コマンド

この章では、いくつかの便利なSEDコマンドについて説明します。

削除コマンド

SEDは、テキストを操作するためのさまざまなコマンドを提供します。 まず、 delete コマンドについて調べてみましょう。 削除コマンドの実行方法は次のとおりです。

[address1[,address2]]d
*address1* および *address2* は、それぞれ開始アドレスと終了アドレスであり、行番号またはパターン文字列のいずれかです。 これらのアドレスは両方ともオプションのパラメーターです。

名前が示すように、deleteコマンドは削除操作の実行に使用され、SEDはオンラインで動作するため、このコマンドは行の削除に使用されると言えます。 deleteコマンドは、パターンバッファーからのみ行を削除することに注意してください。行は出力ストリームに送信されず、元のファイルは変更されません。 次の例はポイントを示しています。

[jerry]$ sed 'd' books.txt

しかし、出力はどこにありますか? 行アドレスが指定されていない場合、SEDはデフォルトですべての行で動作します。 したがって、パターンバッファからすべての行が削除されます。 そのため、コマンドは標準出力に何も出力しません。

特定の回線でのみ動作するようにSEDに指示しましょう。 次の例では、4行目のみを削除します。

[jerry]$ sed '4d' 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
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864

さらに、SEDはコンマ(、)を使用してアドレス範囲も受け入れます。 N1からN2の行を削除するようにSEDに指示できます。 たとえば、次の例では、2〜4のすべての行を削除します。

[jerry]$ sed '2, 4 d' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864

SEDのアドレス範囲は数字に限定されていません。 パターンをアドレスとして指定することもできます。 次の例では、著者Paulo Coelhoのすべての書籍を削除します。

[jerry]$ sed '/Paulo Coelho/d' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216
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

テキストパターンを使用してアドレス範囲を指定することもできます。 次の例は、パターン StormFellowship の間のすべての行を削除します。

[jerry]$ sed '/Storm/,/Fellowship/d' books.txt
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864

これに加えて、SEDでドル($)、プラス(+)、チルダ(〜)演算子を使用することもできます。

書き込みコマンド

ファイルに対して実行する重要な操作の1つはバックアップです。つまり、ファイルの別のコピーを作成します。 SEDは、パターンバッファの内容をファイルに保存するための write コマンドを提供します。 以下に示すのは、 delete コマンドに似た write コマンドの構文です。

[address1[,address2]]w file

ここで、 address1address2 はそれぞれ開始アドレスと終了アドレスであり、行番号またはパターン文字列のいずれかです。 これらのアドレスは両方ともオプションのパラメーターです。

上記の構文では、 w は書き込みコマンドを指し、 file はコンテンツを保存するファイル名です。 file パラメーターには注意してください。 ファイル名が指定されると、SEDはファイルが存在しない場合はその場でファイルを作成し、既に存在する場合は上書きします。

SEDを使用してファイルの正確なコピーを作成しましょう。 wfile の間にスペースが1つだけあることに注意してください。

[jerry]$ sed -n 'w books.bak' books.txt
  • books.bak。*という別のファイルを作成しました。両方のファイルのコンテンツが同じであることを確認します。
[jerry]$ diff books.txt books.bak
[jerry]$ echo $?

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

0
*cp* コマンドはまったく同じことを行うと仮定できます。 Yes! *cp* コマンドも同じことを行いますが、SEDは成熟したユーティリティです。 ソースファイルから特定の行のみを含むファイルを作成できます。 偶数行だけを別のファイルに保存しましょう。
[jerry]$ sed -n '2~2 w junk.txt' books.txt
[jerry]$ cat junk.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

writeコマンドでは、コンマ(、)、ドル($)、およびプラス(+)演算子を使用することもできます。

これに加えて、SEDは書き込みコマンドとのパターンマッチングもサポートしています。 個々の著者のすべての本を別のファイルに保存するとします。 退屈で長い方法の1つは手動で行うことであり、より賢い方法はSEDを使用することです。

[jerry]$ sed -n -e '/Martin/w Martin.txt' -e '/Paulo/w Paulo.txt' -e '/Tolkien/w
Tolkien.txt' books.txt

上記の例では、各行をパターンと照合し、一致した行を特定のファイルに保存しています。 とても簡単です。 複数のコマンドを指定するには、SEDコマンドの -e スイッチを使用しました。 次に、各ファイルの内容を見てみましょう。

[jerry]$ cat Martin.txt

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

1) A Storm of Swords, George R. R. Martin, 1216
6) A Game of Thrones, George R. R. Martin, 864

ファイルの内容を表示してみましょう。

[jerry]$ cat Paulo.txt

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

3) The Alchemist, Paulo Coelho, 197
5) The Pilgrimage, Paulo Coelho, 288

ファイルの内容を表示してみましょう。

[jerry]$ cat Tolkien.txt

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

2) The Two Towers, J. R. R. Tolkien, 352
4) The Fellowship of the Ring, J. R. R. Tolkien, 432

優秀な! 期待どおりの結果が得られました。 SEDは本当に素晴らしいユーティリティです。

追加コマンド

テキストエディタの最も便利な操作の1つは、追加機能を提供することです。 SEDは、appendコマンドを使用してこの操作をサポートしています。 以下に、appendの構文を示します。

[address]a\
Append text

行番号4の後に新しい本のエントリを追加しましょう。 次の例は、その方法を示しています

[jerry]$ sed '4 a 7) Adultry, Paulo Coelho, 234' 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
7) Adultry, Paulo Coelho, 234
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864

コマンドセクションでは、 4 は行番号、 a は追加コマンド、残りの部分は追加するテキストを意味します。

ファイルの最後にテキスト行を挿入しましょう。 これを行うには、アドレスとして $ を使用します。 次の例でこれを説明します。

[jerry]$ sed '$ a 7) Adultry, Paulo Coelho, 234' 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
7) Adultry, Paulo Coelho, 234

行番号とは別に、テキストパターンを使用して住所を指定することもできます。 たとえば、次の例では、文字列 The Alchemist に一致した後にテキストを追加します。

[jerry]$ sed '/The Alchemist/a 7) Adultry, Paulo Coelho, 234' 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
7) Adultry, Paulo Coelho, 234
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 '/The/a 7) Adultry, Paulo Coelho, 234' books.txt

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

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

変更コマンド

SEDは、cで表される change または replace コマンドを提供します。 このコマンドは、既存の行を新しいテキストに置き換えるのに役立ちます。 行範囲を指定すると、すべての行がグループとして1つのテキスト行に置き換えられます。 以下に、changeコマンドの構文を示します。

[address1[,address2]]c\
Replace text

3行目を他のテキストに置き換えてみましょう。

[jerry]$ sed '3 c 3) Adultry, Paulo Coelho, 324' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3) Adultry, Paulo Coelho, 324
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は、アドレスとしてパターンも受け入れます。 次の例では、パターンマッチが成功すると行が置き換えられます。

[jerry]$ sed '/The Alchemist/c 3) Adultry, Paulo Coelho, 324' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
3) Adultry, Paulo Coelho, 324
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では、複数の行を単一の行に置き換えることもできます。 次の例では、4番目から6番目までの行を削除し、新しいテキストに置き換えます。

[jerry]$ sed '4, 6 c 4) Adultry, Paulo Coelho, 324' 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) Adultry, Paulo Coelho, 324

挿入コマンド

insertコマンドは、appendと同じように機能します。 唯一の違いは、特定の位置の前に行を挿入することです。 挿入コマンドの構文は次のとおりです。

[address]i\
Insert text

いくつかの例を使用してinsertコマンドを理解しましょう。 次のコマンドは、4行目の前に新しいエントリを挿入します。

[jerry]$ sed '4 i 7) Adultry, Paulo Coelho, 324' 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
7) Adultry, Paulo Coelho, 324
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

上記の例では、 4 はロケーション番号、 i は挿入コマンドを意味し、残りの部分は挿入されるテキストです。

ファイルの先頭にテキストを挿入するには、行アドレスを 1 として指定します。 次のコマンドはこれを示しています。

[jerry]$ sed '1 i 7) Adultry, Paulo Coelho, 324' books.txt

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

7) Adultry, Paulo Coelho, 324
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

さらに、複数の行を挿入できます。 次のコマンドは、最後の行の前に2行を挿入します。

[jerry]$ sed '$ i 7) Adultry, Paulo Coelho, 324

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

8) Eleven Minutes, Paulo Coelho, 304' 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
7) Adultry, Paulo Coelho, 324
8) Eleven Minutes, Paulo Coelho, 304
6) A Game of Thrones, George R. R. Martin, 864

挿入されるエントリは個別の行に入力され、バックスラッシュ(\)文字で区切られることに注意してください。

翻訳コマンド

SEDは文字を翻訳するコマンドを提供し、 y として表されます。 位置によってキャラクターを変換します。 以下に、translateコマンドの構文を示します。

[address1[,address2]]y/list-1/list-2/

変換は、 list 1 から list 2 の同じ位置の文字への文字の位置に基づいており、両方のリストは明示的な文字リストでなければならないことに注意してください。 正規表現と文字クラスはサポートされていません。 さらに、 list 1list 2 のサイズは同じでなければなりません。

次の例では、アラビア数字をローマ数字に変換します。

[jerry]$ echo "1 5 15 20" | sed 'y/151520/IVXVXX/'

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

I V IV XX

lコマンド

スペースで区切られた単語とタブ文字で区切られた単語を、それらを見るだけで区別できますか? 確かに違います。 ただし、SEDはこれを行うことができます。 SEDは l コマンドを使用して、テキストに隠された文字を表示します。 たとえば、 \ t のタブ文字と $ 文字の行末。 以下に、 l コマンドの構文を示します。

[address1[,address2]]l
[address1[,address2]]l [len]

デモンストレーション用のタブ文字を含むファイルを作成しましょう。 簡単にするために、スペースをタブに置き換えるだけで、同じファイルを使用します。 待つ! しかし、それを行う方法-テキストエディターでファイルを開き、各スペースをタブに置き換えますか? 確かに違います! そのためにSEDコマンドを使用できます。

[jerry]$ sed 's//\t/g' books.txt > junk.txt
*l* コマンドを使用して、非表示の文字を表示します。
[jerry]$ sed -n 'l' junk.txt

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

1)\tA\tStorm\tof\tSwords,George\tR.\tR.\tMartin,1216$
2)\tThe\tTwo\tTowers,J.\tR.\tR.\tTolkien,352$
3)\tThe\tAlchemist,Paulo\tCoelho,197$
4)\tThe\tFellowship\tof\tthe\tRing,J.\tR.\tR.\tTolkien,432$
5)\tThe\tPilgrimage,Paulo\tCoelho,288$
6)\tA\tGame\tof\tThrones,George\tR.\tR.\tMartin\t,864$

他のSEDコマンドと同様に、アドレスとして行番号とパターンも受け入れます。 自分で試すことができます。

SEDの別の興味深い機能を詳しく見てみましょう。 特定の文字数の後に行の折り返しを実行するようにSEDに指示できます。 次の例では、25文字の後に行を折り返します。

[jerry]$ sed -n 'l 25' books.txt

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

1) A Storm of Swords,Geo\
rge R. R. Martin,1216$
2) The Two Towers,J. R. \
R. Tolkien,352$
3) The Alchemist,Paulo C\
oelho,197$
4) The Fellowship of the\
 Ring,J. R. R. Tolkien,4\
32$
5) The Pilgrimage,Paulo \
Coelho,288$
6) A Game of Thrones,Geo\
rge R. R. Martin ,864$

上記の例では、lコマンドの後にラップ制限が提供されていることに注意してください。 この場合、25文字です。 このオプションはGNU固有であり、SEDの他のバリアントでは機能しない場合があります。

折り返し制限が0の場合、改行文字がない限り、行を分割しないことを意味します。 次の簡単なコマンドはこれを示しています。

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

終了コマンド

Quitコマンドは、現在の実行フローを終了するようにSEDに指示します。 q コマンドで表されます。 quitコマンドの構文は次のとおりです。

[address]q
[address]q [value]

quitコマンドはアドレスの範囲を受け入れず、単一のアドレスのみをサポートすることに注意してください。 デフォルトでは、SEDは読み取り、実行、およびワークフローの繰り返しに従います。ただし、quitコマンドが検出されると、単に現在の実行が停止されます。

ファイルの最初の3行を印刷してみましょう。

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

行番号に加えて、テキストパターンも使用できます。 次のコマンドは、パターンマッチが成功すると終了します。

[jerry]$ sed '/The Alchemist/q' 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

これに加えて、SEDは終了ステータスとして使用できる*値*を受け入れることもできます。 次のコマンドは、終了ステータスを100と表示します。

[jerry]$ sed '/The Alchemist/q 100' 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

次に、終了ステータスを確認しましょう。

[jerry]$ echo $?

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

100

読み取りコマンド

ファイルの内容を読み取り、特定の条件が一致したときにそれらを表示するようにSEDに指示できます。 コマンドはアルファベット r で表されます。 以下に、読み取りコマンドの構文を示します。

[address]r file
*r* コマンドとファイル名の間にスペースが1つだけあることに注意してください。

簡単な例でそれを理解しましょう。 junk.txt というサンプルファイルを作成します。

[jerry]$ echo "This is junk text." > junk.txt

次のコマンドは、 junk.txt の内容を読み取り、3行目の後に挿入するようにSEDに指示します。

[jerry]$ sed '3 r junk.txt' 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
This is junk text.
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

上記の例では、3は行アドレスを意味し、 r はコマンド名、 junk.txt は内容が表示されるファイル名です。 さらに、GNU SEDはさまざまなアドレスも受け入れます。 たとえば、次のコマンドは、 junk.txt の内容を3行目、4行目、5行目の後に挿入します。

[jerry]$ sed '3, 5 r junk.txt' 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
This is junk text.
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
This is junk text.
5) The Pilgrimage, Paulo Coelho, 288
This is junk text.
6) A Game of Thrones, George R. R. Martin, 864

他のSEDコマンドと同様に、読み取りコマンドもアドレスとしてパターンを受け入れます。 たとえば、次のコマンドは、パターンマッチが成功したときに junk.txt の内容を挿入します。

[jerry]$ sed '/Paulo/r junk.txt' 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
This is junk text.
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
5) The Pilgrimage, Paulo Coelho, 288
This is junk text.
6) A Game of Thrones, George R. R. Martin, 864

コマンド実行

*execute* コマンドを使用して、SEDから外部コマンドを実行できます。 *e* で表されます。 以下に、executeコマンドの構文を示します。
[address1[,address2]]e [command]

簡単な例でexecuteコマンドを説明しましょう。 次のSEDコマンドは、3行目の前にUNIXの date コマンドを実行します。

[jerry]$ sed '3 e date' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
Sun Sep  7 18:04:49 IST 2014
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

他のコマンドと同様に、アドレスとしてパターンも受け入れます。 たとえば、次の例では、パターンマッチが成功したときに date コマンドを実行します。 各パターンが一致した後、最初にコマンドが実行され、次にパターンバッファーの内容が表示されることに注意してください。

[jerry]$ sed '/Paulo/e date' books.txt

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

1) A Storm of Swords, George R. R. Martin, 1216
2) The Two Towers, J. R. R. Tolkien, 352
Sun Sep  7 18:06:04 IST 2014
3) The Alchemist, Paulo Coelho, 197
4) The Fellowship of the Ring, J. R. R. Tolkien, 432
Sun Sep  7 18:06:04 IST 2014
5) The Pilgrimage, Paulo Coelho, 288
6) A Game of Thrones, George R. R. Martin, 864
*e* コマンドの構文を注意深く観察すると、 *command* はオプションであることがわかります。 * eの後にコマンドが提供されない場合、*はパターンバッファーの内容を外部コマンドとして扱います。 これを説明するために、いくつかの簡単なコマンドを含むcommands.txtファイルを作成しましょう。
[jerry]$ echo -e "date\ncal\nuname" > commands.txt
[jerry]$ cat commands.txt

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

date
cal
uname

ファイルからのコマンドは一目瞭然です。 e の後に command がない場合、SEDはこれらすべてのコマンドを1つずつ実行します。 次の簡単な例はこれを示しています。

[jerry]$ sed 'e' commands.txt

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

Sun Sep  7 18:14:20 IST 2014
   September 2014
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Linux

他のSEDコマンドと同様に、executeコマンドもすべての有効なアドレス範囲を受け入れます。

その他のコマンド

デフォルトでは、SEDは単一の回線で動作しますが、複数の回線でも動作できます。 複数行のコマンドは大文字で示されます。 たとえば、 n コマンドとは異なり、 N コマンドはパターンスペースをクリアして印刷しません。 代わりに、現在のパターンスペースの最後に改行(\ n)を追加し、入力ファイルの次の行を現在のパターンスペースに追加し、残りのSEDコマンドを実行してSEDの標準フローを続行します。 以下に示すのは、 N コマンドの構文です。

[address1[,address2]]N

本のタイトルとそれぞれの著者のコンマ区切りリストを印刷してみましょう。 次の例はこれを示しています。

[jerry]$ sed 'N; s/\n/,/g' 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

上記の例がどのように機能するかを理解しましょう。 N コマンドは、最初の行、つまりA Sword of Swordsをパターンバッファーに読み込み、\ nの後に次の行を追加します。 パターンスペースにA Storm of Swords * \ n * George Rが含まれるようになりました。 R. マーティン。 次のステップでは、改行をコンマに置き換えます。

*p* コマンドと同様に、 *N* コマンドで作成された複数行パターンスペースの最初の部分(埋め込まれた改行まで)を印刷する *P* コマンドがあります。 以下に示すのは、 *p* コマンドに似た *P* コマンドの構文です。
[address1[,address2]]P

前の例では、 N コマンドによって、書籍名とその著者の改行で区切られたリストが作成されることがわかりました。 その最初の部分のみ、つまり本のタイトルのみを印刷しましょう。 次のコマンドはこれを示しています。

[jerry]$ sed -n 'N;P' books.txt

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

A Storm of Swords
The Two Towers
The Alchemist
The Fellowship of the Ring
The Pilgrimage
A Game of Thrones
*N* がない場合、 *p* コマンドと同じように動作することに注意してください。 次の簡単なコマンドは、このシナリオを示しています。
[jerry]$ sed -n '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

これに加えて、SEDはバージョンをチェックする v コマンドも提供します。 提供されたバージョンがインストールされたSEDバージョンよりも大きい場合、コマンドの実行は失敗します。 このオプションはGNU固有であり、SEDの他のバリアントでは機能しない可能性があることに注意してください。 以下に示すのは、 v コマンドの構文です。

[address1[,address2]]v [version]

まず、SEDの現在のバージョンを確認します。

[jerry]$ sed --version

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

sed (GNU sed) 4.2.2

次の例では、SEDバージョンはバージョン4.2.2よりも大きいため、SEDコマンドは実行を中止します。

[jerry]$ sed 'v 4.2.3' books.txt

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

sed: -e expression #1, char 7: expected newer version of sed

ただし、提供されたバージョンがバージョン4.2.2以下の場合、コマンドは期待どおりに機能します。

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