Sed-quick-guide

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

ストリームエディター-概要

頭字語SEDは Stream EDitor の略です。これは、テキストを解析してシームレスに変換するシンプルで強力なユーティリティです。 SEDは、1973年から74年にかけてリーEによって開発されました。 ベル研究所のマクマホン。 現在、すべての主要なオペレーティングシステムで実行されています。

McMahonは汎用のライン指向エディターを作成し、最終的にSEDになりました。 SEDは、edエディターから構文と多くの便利な機能を借りました。 開始以来、正規表現をサポートしています。 SEDは、ファイルおよびパイプからの入力を受け入れます。 さらに、標準入力ストリームからの入力も受け入れることができます。

SEDは、Free Software Foundation(FSF)によって作成および保守され、GNU/Linuxによって配布されます。 そのため、 GNU SED と呼ばれることがよくあります。初心者ユーザーにとっては、SEDの構文は不可解に見えるかもしれません。 ただし、構文に慣れると、数行のSEDスクリプトで多くの複雑なタスクを解決できます。 これがSEDの美しさです。

SEDの典型的な使用

SEDは、次のようなさまざまな方法で使用できます。

  • テキスト置換、
  • テキストファイルの選択的印刷、
  • テキストファイルのインプレース編集、
  • テキストファイルの非対話型編集など。

ストリームエディター-環境

この章では、GNU/LinuxシステムでSED環境をセットアップする方法について説明します。

パッケージマネージャーを使用したインストール

一般的に、SEDはほとんどのGNU/Linuxディストリビューションでデフォルトで利用可能です。 which コマンドを使用して、システムに存在するかどうかを識別します。 そうでない場合は、次のように apt パッケージマネージャーを使用してDebianベースのGNU/LinuxにSEDをインストールします。

[jerry]$ sudo apt-get install sed

インストール後、コマンドラインからSEDにアクセスできることを確認してください。

[jerry]$ sed --version

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

sed (GNU sed) 4.2.2
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Jay Fenlason, Tom Lord, Ken Pizzini,
and Paolo Bonzini.
GNU sed home page: .
General help using GNU software: .
E-mail bug reports to: .
Be sure to include the word "sed" somewhere in the "Subject:" field.

同様に、RPMベースのGNU/LinuxにSEDをインストールするには、次のようにyumパッケージマネージャーを使用します。

[root]# yum -y install sed

インストール後、コマンドラインからSEDにアクセスできることを確認してください。

[root]# sed --version

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

GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
GNU sed home page: .
General help using GNU software: .
E-mail bug reports to: .
Be sure to include the word "sed" somewhere in the "Subject:" field.

ソースコードからのインストール

GNU SEDはGNUプロジェクトの一部であるため、そのソースコードは無料でダウンロードできます。 パッケージマネージャーを使用してSEDをインストールする方法は既に説明しました。 ソースコードからSEDをインストールする方法を理解しましょう。

次のインストールは、すべてのGNU/Linuxソフトウェア、および他のほとんどの自由に利用可能なプログラムにも適用できます。 インストール手順は次のとおりです。

  • 本物の場所からソースコードをダウンロードします。 コマンドラインユーティリティ wget は、この目的に役立ちます。
[jerry]$ wget ftp://ftp.gnu.org/gnu/sed/sed-4.2.2.tar.bz2

ダウンロードしたソースコードを解凍して抽出します。

[jerry]$ tar xvf sed-4.2.2.tar.bz2

ディレクトリに移動し、configureを実行します。

[jerry]$ ./configure

正常に完了すると、 configure はMakefileを生成します。 ソースコードをコンパイルするには、 make コマンドを発行します。

[jerry]$ make

テストスイートを実行して、ビルドがクリーンであることを確認できます。 これはオプションの手順です。

[jerry]$ make check

最後に、SEDユーティリティをインストールします。 スーパーユーザー特権を持っていることを確認してください。

[jerry]$ sudo make install

それだ! SEDが正常にコンパイルおよびインストールされました。 次のように sed コマンドを実行して検証します。

[jerry]$ sed --version

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

sed (GNU sed) 4.2.2
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Jay Fenlason, Tom Lord, Ken Pizzini,
and Paolo Bonzini.
GNU sed home page: .
General help using GNU software: .
E-mail bug reports to: .
Be sure to include the word "sed" somewhere in the "Subject:" field.

ストリームエディター-ワークフロー

この章では、SEDが正確に機能する仕組みを探ります。 熟練したSEDユーザーになるには、その内部を知る必要があります。 SEDは、読み取り、実行、表示という単純なワークフローに従います。 次の図は、ワークフローを示しています。

ストリームエディターのワークフロー

  • 読み取り:SEDは入力ストリーム(ファイル、パイプ、またはstdin)から行を読み取り、 pattern buffer と呼ばれる内部バッファーに格納します。
  • 実行:すべてのSEDコマンドがパターンバッファーに順番に適用されます。 デフォルトでは、行アドレス指定が指定されていない限り、SEDコマンドはすべての行に(グローバルに)適用されます。
  • 表示:(変更された)コンテンツを出力ストリームに送信します。 データを送信した後、パターンバッファは空になります。
  • 上記のプロセスは、ファイルが使い果たされるまで繰り返されます。

注意点

  • パターンバッファは、SEDが使用するプライベートなメモリ内の揮発性ストレージエリアです。
  • デフォルトでは、すべてのSEDコマンドがパターンバッファーに適用されるため、入力ファイルは変更されません。 GNU SEDは、入力ファイルをその場で変更する方法を提供します。 これについては後のセクションで検討します。
  • hold buffer と呼ばれる別のメモリ領域があり、これもプライベートなメモリ内の揮発性ストレージ領域です。 後で取得するために、データをホールドバッファに保存できます。 各サイクルの終わりに、SEDはパターンバッファーの内容を削除しますが、ホールドバッファーの内容はSEDサイクルの間持続します。 ただし、SEDコマンドはホールドバッファで直接実行できないため、SEDではホールドバッファとパターンバッファ間でデータを移動できます。
  • 最初は、パターンバッファとホールドバッファの両方が空です。
  • 入力ファイルが提供されない場合、SEDは標準入力ストリーム(stdin)からの入力を受け入れます。
  • デフォルトでアドレス範囲が提供されない場合、SEDは各行で動作します。

テキストファイル quote.txt を作成して、有名な著者Paulo Coelhoの引用を含めましょう。

[jerry]$ vi quote.txt
There is only one thing that makes a dream impossible to achieve: the fear of failure.
 - Paulo Coelho, The Alchemist

SEDのワークフローを理解するために、SEDを使用してquote.txtファイルの内容を表示してみましょう。 この例は、 cat コマンドをシミュレートします。

[jerry]$ sed '' quote.txt

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

There is only one thing that makes a dream impossible to achieve: the fear of failure.

上記の例では、quote.txtは入力ファイル名であり、その前にSEDコマンドを意味する単一引用符のペアがあります。 この操作をわかりやすく説明しましょう。

最初のSEDは、入力ファイルquote.txtから行を読み取り、パターンバッファーに保存します。 次に、パターンバッファにSEDコマンドを適用します。 この例では、SEDコマンドは存在しないため、パターンバッファーで操作は実行されません。 最後に、パターンバッファの内容を削除して標準出力に出力します。 簡単じゃないですか?

次の例では、SEDは標準入力ストリームからの入力を受け入れます。

[jerry]$ sed ''

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

There is only one thing that makes a dream impossible to achieve: the fear of failure.
There is only one thing that makes a dream impossible to achieve: the fear of failure.

ここでは、最初の行はキーボードから入力され、2行目はSEDによって生成された出力です。 SEDセッションを終了するには、ctrl-D(^ D)を押します。

ストリームエディター-基本構文

この章では、SEDがサポートする基本的なコマンドとそのコマンドライン構文を紹介します。 SEDは、次の2つの形式で呼び出すことができます。

sed [-n] [-e] 'command(s)' files
sed [-n] -f scriptfile files

最初の形式では、コマンドをインラインで指定でき、それらは単一引用符で囲まれます。 後者では、SEDコマンドを含むスクリプトファイルを指定できます。 ただし、両方のフォームを複数回一緒に使用できます。 SEDは、その動作を制御するためのさまざまなコマンドラインオプションを提供します。

複数のSEDコマンドを指定する方法を見てみましょう。 SEDは、特定の行を削除する delete コマンドを提供します。 1行目、2行目、5行目を削除しましょう。 当分の間、deleteコマンドのすべての詳細を無視してください。 削除コマンドの詳細については後で説明します。

まず、 cat コマンドを使用してファイルの内容を表示します。

[jerry]$ cat 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に指示します。 ここでは、3行を削除するために、-eオプションで3つの個別のコマンドを指定しています。

[jerry]$ sed -e '1d' -e '2d' -e '5d' books.txt

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

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

さらに、複数のSEDコマンドをテキストファイルに記述し、テキストファイルをSEDの引数として提供できます。 SEDは、パターンバッファーに各コマンドを適用できます。 次の例は、SEDの2番目の形式を示しています。

まず、SEDコマンドを含むテキストファイルを作成します。 わかりやすくするために、同じSEDコマンドを使用してみましょう。

[jerry]$ echo -e "1d\n2d\n5d" > commands.txt
[jerry]$ cat commands.txt

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

1d
2d
5d

次に、テキストファイルからコマンドを読み取るようにSEDに指示します。 ここで、上記の例で示したのと同じ結果が得られます。

[jerry]$ sed -f commands.txt books.txt

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

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

標準オプション

SEDは次の標準オプションをサポートしています。

  • -n:パターンバッファのデフォルトの印刷。 たとえば、次のSEDコマンドは出力を表示しません。
[jerry]$ sed -n '' quote.txt

-e:次の引数は編集コマンドです。 ここで、角括弧は必須パラメーターを意味します。 このオプションを使用すると、複数のコマンドを指定できます。 各行を2回印刷します。

[jerry]$ sed -e '' -e 'p' quote.txt

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

There is only one thing that makes a dream impossible to achieve: the fear of failure.
There is only one thing that makes a dream impossible to achieve: the fear of failure.
 - Paulo Coelho, The Alchemist
 - Paulo Coelho, The Alchemist
  • -f:次の引数は、編集コマンドを含むファイルです。 山括弧は必須パラメーターを意味します。 次の例では、ファイルを介して印刷コマンドを指定します。
[jerry]$ echo "p" > commands
[jerry]$ sed -n -f commands quote.txt

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

There is only one thing that makes a dream impossible to achieve: the fear of failure.
 - Paulo Coelho, The Alchemist

GNU固有のオプション

GNU固有のSEDオプションについて簡単に説明します。 これらのオプションはGNU固有のものであることに注意してください。また、SEDの他のバリアントではサポートされない場合があります。 後のセクションで、これらのオプションについて詳しく説明します。

  • -n、-quiet、-silent:標準の-nオプションと同じです。
  • -e script、-expression = script:標準の-eオプションと同じです。
  • -f script-file、-file = script-file:標準の-fオプションと同じです。
  • --follow-symlinks:このオプションが提供されている場合、SEDはファイルをその場で編集しながらシンボリックリンクをたどります。
  • -i [SUFFIX]、--in-place [= SUFFIX]:このオプションは、ファイルをその場で編集するために使用されます。 接尾辞が指定されている場合、元のファイルのバックアップが作成されます。指定されていない場合は、元のファイルが上書きされます。
  • -l N、--line-lenght = N:このオプションは、lコマンドの行の長さをN文字に設定します。
  • --posix:このオプションは、すべてのGNU拡張機能を無効にします。
  • -r、-regexp-extended:このオプションにより、基本的な正規表現ではなく拡張正規表現を使用できます。
  • -u、-unbuffered:このオプションを指定すると、SEDは最小量のデータを入力ファイルからロードし、出力バッファーをより頻繁にフラッシュします。 出力を待たないときに、「tail -f」の出力を編集するのに便利です。
  • -z、-null-data:デフォルトでは、SEDは各行を改行文字で区切ります。 NULLデータオプションが指定されている場合、行をNULL文字で区切ります。

ストリームエディター-ループ

他のプログラミング言語と同様に、SEDも実行の流れを制御するループおよび分岐機能を提供します。 この章では、SEDでループとブランチを使用する方法について詳しく説明します。

SEDのループは、 goto ステートメントと同様に機能します。 SEDは、ラベルでマークされた行にジャンプして、残りのコマンドの実行を続行できます。 SEDでは、次のように label を定義できます。

:label
:start
:end
:up

上記の例では、コロン(:)の後の名前はラベル名を意味します。

特定のラベルにジャンプするには、 b コマンドの後にラベル名を使用します。 ラベル名が省略されている場合、SEDはSEDファイルの最後にジャンプします。

ループと分岐を理解するための簡単なSEDスクリプトを作成しましょう。 books.txtファイルには、書籍のタイトルとその著者のいくつかのエントリがあります。 次の例では、本のタイトルとその著者名を1行にコンマで区切って組み合わせています。 次に、パターン「Paulo」を検索します。 パターンが一致する場合、行の前にハイフン(-)を印刷します。そうでない場合は、行を印刷する Print ラベルにジャンプします。

[jerry]$ sed -n '
h;n;H;x
s/\n/,/
/Paulo/!b Print
s/^/-/
:Print
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

一見すると、上記のスクリプトは不可解に見えるかもしれません。 これを分かりやすく説明しましょう。

  • 最初の2つのコマンドは、わかりやすい h; n; H; xs/\ n/、/ で、本のタイトルとその著者をコンマ(、)で区切って組み合わせています。
  • 3番目のコマンドは、パターンが一致しない場合にのみラベル Print にジャンプします。そうでない場合、4番目のコマンドによって置換が実行されます。
  • :Print *は単なるラベル名であり、すでにご存じのとおり、 *p は印刷コマンドです。

読みやすくするために、各SEDコマンドは別々の行に配置されています。 ただし、次のようにすべてのコマンドを1行に配置することもできます。

[jerry]$ sed -n 'h;n;H;x;s/\n/,/;/Paulo/!b Print; s/^/-/; :Print;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

ストリームエディター-ブランチ

ブランチは、tコマンドを使用して作成できます。 t コマンドは、前の代替コマンドが成功した場合にのみラベルにジャンプします。 前の章と同じ例を取り上げますが、1つのハイフン(-)を出力する代わりに、4つのハイフンを出力します。 次の例は、 t コマンドの使用法を示しています。

[jerry]$ sed -n '
h;n;H;x
s/\n/,/
:Loop
/Paulo/s/^/-/
/----/!t Loop
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

上記の例では、最初の2つのコマンドは一目瞭然です。 3番目のコマンドは、ラベル Loop を定義します。 行に文字列「Paulo」が含まれ、 t コマンドが行の先頭に4つのハイフンが現れるまで手順を繰り返す場合、4番目のコマンドはハイフン(-)を付加します。

読みやすくするために、各SEDコマンドは別々の行に書き込まれます。 それ以外の場合は、次のようにワンライナーSEDを作成できます。

[jerry]$ sed -n 'h;n;H;x; s/\n/,/; :Loop;/Paulo/s/^/-/;/----/!t Loop; 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

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

ファイルに対して実行する基本的な操作の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

ストリームエディター-パターン範囲

前の章で、SEDがアドレス範囲を処理する方法を学びました。 この章では、SEDがパターン範囲を処理する方法について説明します。 パターン範囲は、単純なテキストでも複雑な正規表現でもかまいません。 例を挙げましょう。 次の例は、著者Paulo Coelhoのすべての本を印刷します。

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

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

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

上記の例では、SEDは各行で動作し、文字列Pauloに一致する行のみを出力します。

パターン範囲とアドレス範囲を組み合わせることもできます。 次の例では、Alchemistの最初の一致から5行目までの行を出力します。

[jerry]$ sed -n '/Alchemist/, 5 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

パターンの最初の出現を見つけた後、Dollar($)文字を使用してすべての行を印刷できます。 次の例では、パターンTheの最初の出現を検出し、ファイルの残りの行をすぐに出力します

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

また、コンマ(、)演算子を使用して複数のパターン範囲を指定することもできます。 次の例では、パターンTwoと巡礼の間に存在するすべての行を印刷します。

[jerry]$ sed -n '/Two/,/Pilgrimage/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

さらに、パターン範囲内でplus(+)演算子を使用できます。 次の例では、パターンTwoの最初の出現を検出し、その後に次の4行を出力します。

[jerry]$ sed -n '/Two/, +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に慣れるためのいくつかの例を提供しました。 自分でいくつかの例を試してみると、いつでも詳細を知ることができます。

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

この章では、いくつかの便利な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

ストリームエディター-特殊文字

SEDは、コマンドとして扱われる2つの特殊文字を提供します。 この章では、これら2つの特殊文字の使用法を説明します。

=コマンド

「=」コマンドは行番号を扱います。 「=」コマンドの構文は次のとおりです。

[/pattern/]=
[address1[,address2]]=

=コマンドは、行番号に続いてその内容を標準出力ストリームに書き込みます。 次の例はこれを示しています。

[jerry]$ sed '=' books.txt

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

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

行番号と最初の4行の内容を印刷してみましょう。 次のコマンドは、最初の4行を行番号付きで、残りを行番号なしで印刷します。

[jerry]$ sed '1, 4=' books.txt

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

1
1) A Storm of Swords, George R. R. Martin, 1216
2
2) The Two Towers, J. R. R. Tolkien, 352
3
3) The Alchemist, Paulo Coelho, 197
4
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に指示できます。 次の例では、パターン「Paulo」を含む行番号を出力します。

[jerry]$ sed '/Paulo/=' books.txt

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

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

次のSEDコマンドが何をするか推測できますか?

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

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

6

はい、その通りです。 ファイルに存在する行の総数をカウントします。 コードをわかりやすく説明します。 コマンドセクションでは、 "$ ="を使用しました。これは、最後の行の行番号とその内容を出力します。 しかし、パターンバッファのデフォルトの印刷を抑制する -n フラグも提供しました。 したがって、最後の行番号のみが表示されます。

&コマンド

SEDは特殊文字&をサポートします。 パターンの一致が成功するたびに、この特殊文字は一致したパターンを保存します。 多くの場合、置換コマンドとともに使用されます。 この効率的な機能を活用する方法を見てみましょう。

book.txtファイルの各行には番号が付けられています。 各行の先頭に「書籍番号」という言葉を追加しましょう。 次の例はこれを示しています。

[jerry]$ sed 's/[[:digit:]]/Book number &/' books.txt

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

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

この例は非常に簡単です。 最初に、行番号である数字の最初の出現を検索し(これが:digit:を使用した理由です)、SEDは一致したパターンを特殊文字&に自動的に保存します。 2番目のステップでは、一致した各パターンの前、つまりすべての行の前に Book number という単語を挿入します。

別の例を見てみましょう。 book.txtファイルでは、最後の数字は本のページ数を意味します。 その前に "Pages ="を追加しましょう。 これを行うには、最後に出現する数字を見つけて、「Pages =&」に置き換えます。 ここでは、一致したパターン、つまりページ数を保存します

[jerry]$ sed 's/[[:digit:]]*$/Pages = &/' books.txt

上記の構文を実行すると、次の結果が得られます。

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

とりあえず、 :digit: $ *は最後に見つかった数字を見つけることを覚えておいてください。 「正規表現」の章では、正規表現について詳しく説明します。

ストリームエディター-文字列

代替コマンド

「検索して置換」などのテキスト置換操作は、テキストエディターでは一般的です。 このセクションでは、SEDがテキスト置換を実行する方法を示します。 置換コマンドの構文は次のとおりです。

[address1[,address2]]s/pattern/replacement/[flags]

ここで、 address1address2 はそれぞれ開始アドレスと終了アドレスであり、行番号またはパターン文字列のいずれかです。 これらのアドレスは両方ともオプションのパラメーターです。 パターンは、置換文字列で置き換えるテキストです。 さらに、SEDでオプションのフラグを指定できます。

books.txtファイルでは、各列を区切るためにコンマ(、)を使用しています。 縦棒(|)を使用して各列を区切りましょう。 これを行うには、コンマ(、)を垂直バー(|)に置き換えます。

[jerry]$ sed 's/,/|/' 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

注意深く観察すると、最初のコンマのみが置き換えられ、2番目のコンマはそのまま残ります。 Why? パターンが一致するとすぐに、SEDはそれを置換文字列で置き換え、次の行に移動します。 デフォルトでは、最初の出現のみを置き換えます。 すべての出現を置換するには、次のようにSEDでグローバルフラグ(g)を使用します。

[jerry]$ sed 's/,/|/g' 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に指示できます。 次の例では、行にパターンThe Pilgrimageが含まれる場合にのみ、コンマ(、)を垂直バー(|)に置き換えます。

[jerry]$ sed '/The Pilgrimage/s/,/|/g' 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はパターンの特定の出現を置き換えることができます。 コンマ(、)の2番目のインスタンスのみを垂直バー(|)に置き換えます。

[jerry]$ sed 's/,/|/2' 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コマンドの末尾(またはフラグの場所)の番号は2番目のオカレンスを意味します。

SEDは興味深い機能を提供します。 置換を実行した後、SEDは変更された行のみを表示するオプションを提供します。 この目的のために、SEDは印刷を参照する p フラグを使用します。 次の例では、変更された行のみをリストします。

[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/p' books.txt

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

3) The Alchemist, PAULO COELHO, 197
5) The Pilgrimage, PAULO COELHO, 288

変更した行を別のファイルに保存することもできます。 この結果を得るには、 w フラグを使用します。 次の例は、その方法を示しています。

[jerry]$ sed -n 's/Paulo Coelho/PAULO COELHO/w junk.txt' books.txt

同じSEDコマンドを使用しました。 junk.txt ファイルの内容を確認しましょう。

[jerry]$ cat junk.txt

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

3) The Alchemist, PAULO COELHO, 197
5) The Pilgrimage, PAULO COELHO, 288

大文字と小文字を区別しない置換を実行するには、大文字と小文字を区別しないことを示すiフラグを使用します。 次の例では、大文字と小文字を区別しない置換を実行します。

[jerry]$ sed  -n 's/pAuLo CoElHo/PAULO COELHO/pi' books.txt

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

3) The Alchemist, PAULO COELHO, 197
5) The Pilgrimage, PAULO COELHO, 288

これまでは、区切り文字としてフォアスラッシュ(/)文字のみを使用しましたが、垂直バー(|)、アットマーク(@)、キャレット(^)、感嘆符(!)を区切り文字として使用することもできます。 次の例は、区切り文字として他の文字を使用する方法を示しています。

パス /bin/sed を*/home/jerry/src/sed/sed-4.2.2/sed。*に置き換える必要があると仮定します。したがって、SEDコマンドは次のようになります。

[jerry]$ echo "/bin/sed" | sed 's/\/bin\/sed/\/home\/jerry\/src\/sed\/sed-4.2.2\/sed/'

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

/home/jerry/src/sed/sed-4.2.2/sed

このコマンドをより読みやすく、理解しやすくすることができます。 区切り文字として垂直バー(|)を使用して、結果を見てみましょう。

[jerry]$ echo "/bin/sed" | sed 's|/bin/sed|/home/jerry/src/sed/sed-4.2.2/sed|'

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

/home/jerry/src/sed/sed-4.2.2/sed

確かに! 同じ結果が得られ、構文がより読みやすくなりました。 同様に、次のように区切り記号として「アット」記号(@)を使用できます。

[jerry]$ echo "/bin/sed" | sed 's@/bin/sed@/home/jerry/src/sed/sed-4.2.2/sed@'

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

/home/jerry/src/sed/sed-4.2.2/sed

これに加えて、脱字記号としてキャレット(^)を使用できます。

[jerry]$ echo "/bin/sed" | sed 's^/bin/sed^/home/jerry/src/sed/sed-4.2.2/sed^'

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

/home/jerry/src/sed/sed-4.2.2/sed

次のように、区切り記号として感嘆符(!)を使用することもできます。

[jerry]$ echo "/bin/sed" | sed 's!/bin/sed!/home/jerry/src/sed/sed-4.2.2/sed!'

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

/home/jerry/src/sed/sed-4.2.2/sed

一般に、バックスラッシュ(/)は区切り文字として使用されますが、SEDでサポートされている他の区切り文字を使用する方が便利な場合があります。

部分文字列を作成する

強力な代替コマンドを学びました。 一致したテキストから部分文字列を見つけることができるかどうかを見てみましょう。 例の助けを借りてそれを行う方法を理解しましょう。

次のテキストを考えてみましょう。

[jerry]$ echo "Three One Two"

シーケンスに配置する必要があるとします。 つまり、最初に1つ、次に2つ、最後に3つを印刷する必要があります。 次のワンライナーが必要なことを行います。

echo "Three One Two" | sed 's|\(\w\+\) \(\w\+\) \(\w\+\)|\2 \3 \1|'

上記の例では、垂直バー(|)が区切り文字として使用されていることに注意してください。

SEDでは、グループ化演算子を使用して部分文字列を指定できます。また、* \(および \)*のように、エスケープ文字をプレフィックスとして付ける必要があります。

*\ w* は、任意の文字、数字、またはアンダースコアに一致する正規表現であり、「+」を使用して複数の文字に一致します。 つまり、正規表現* \(\ w \ + \)*は、入力文字列の1つの単語に一致します。

入力文字列には、スペースで区切られた3つの単語があるため、スペースで区切られた 3 正規表現があります。 最初の正規表現は最初の単語、つまり3つを保存し、2番目は One という単語を保存し、3番目は Two という単語を保存します

これらのサブストリングは、* \ N、によって参照されます(Nはサブストリング番号です)。 したがって、 *\ 2 は2番目のサブストリング、つまり One;を出力します。 \ 3 は3番目のサブストリング、つまり Two; を出力し、 \ 1 は最初のサブストリング、つまり Three を出力します

これらの単語をカンマ(、)で区切り、それに応じて正規表現を変更しましょう。

[jerry]$ echo "Three,One,Two" | sed 's|\(\w\+\),\(\w\+\),\(\w\+\)|\2,\3,\1|'

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

One,Two,Three

正規表現にはスペースの代わりにコンマ(、)が含まれていることに注意してください。

文字列置換フラグ(GNU SEDのみ)

前のセクションで、置換コマンドの例をいくつか見ました。 GNU SEDは、置換文字列で使用できる特別なエスケープシーケンスを提供します。 これらの文字列置換フラグはGNU固有であり、SEDの他のバリアントでは機能しない可能性があることに注意してください。 ここでは、文字列置換フラグについて説明します。

  • \ L:置換文字列で\ Lを指定すると、\ Lの後の単語の残りのすべての文字が小文字として扱われます。 たとえば、文字「ULO」は小文字として扱われます。
[jerry]$ sed -n 's/Paulo/PA\LULO/p' books.txt

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

3) The Alchemist, PAulo Coelho, 197
5) The Pilgrimage, PAulo Coelho, 288
  • \ u:置換文字列で\ uが指定されている場合、\ uの直後の文字を大文字として扱います。 次の例では、文字 'a’および 'o’の前に\ uが使用されています。 したがって、SEDはこれらの文字を大文字として扱います。
[jerry]$ sed -n 's/Paulo/p\uaul\uo/p' books.txt

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

3) The Alchemist, pAulO Coelho, 197
5) The Pilgrimage, pAulO Coelho, 288
  • \ U:置換文字列で\ Uが指定されている場合、\ Uの後の単語の残りのすべての文字を大文字として扱います。
[jerry]$ sed -n 's/Paulo/\Upaulo/p' books.txt

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

3) The Alchemist, PAULO Coelho, 197
5) The Pilgrimage, PAULO Coelho, 288
  • \ E:このフラグは\ Lまたは\ Uとともに使用する必要があります。 フラグ\ Lまたは\ Uによって開始された変換を停止します。 次の例では、最初の単語のみが大文字に置き換えられます。
[jerry]$ sed -n 's/Paulo Coelho/\Upaulo \Ecoelho/p' books.txt

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

3) The Alchemist, PAULO coelho, 197
5) The Pilgrimage, PAULO coelho, 288

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

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

[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* コマンドは、パターンバッファーの内容を出力し、パターンバッファーをクリアし、次の行をパターンバッファーにフェッチして、コマンドを適用します。

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

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 of Swordsをパターンバッファに読み込みます。
  • x コマンドは、この行を保持バッファーに移動します。
  • n は次の行、つまりGeorge Rをフェッチします。 R. Martinをパターンバッファーに追加します。
  • 制御はコマンドに渡され、その後にパターンバッファの内容を出力する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

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

[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 of Swordsが含まれます。 2番目のステップでは、行にパターンPauloが含まれているかどうかを確認します。 パターンが一致しないため、何も実行されません。

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

その後、パターンバッファにパターンPauloが含まれているかどうかをチェックします。 パターンマッチが成功すると、パターンバッファの内容をホールドバッファと交換します。 これで、パターンバッファにはThe Alchemistが含まれ、ホールドバッファにはPaulo Coelhoが含まれます。 最後に、パターンバッファの内容を出力します。 同じ手順が巡礼のパターンにも適用されます。

*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回目のパスの終わりに、両方のバッファーにThe Alchemistが含まれます。 6番目のパスの開始時に、Paulo Coelho行を読み取り、パターンが一致するため、この行をホールドバッファーにコピーしません。 したがって、パターンスペースにはPaulo Coelhoが含まれ、ホールドスペースにはThe Alchemistが含まれます。

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

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

[address1[,address2]]G

次に、著者Paulo Coelhoの名前とそれに続く本のタイトルを印刷する前の例を見てみましょう。 同じ結果を得るには、次の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

ストリームエディター-正規表現

SEDを強力かつ効率的にするのは正規表現です。 正規表現を使用すると、多くの複雑なタスクを解決できます。 コマンドラインのエキスパートなら誰でも、正規表現の力を知っています。

他の多くのGNU/Linuxユーティリティと同様に、SEDも正規表現をサポートしています。これは regex と呼ばれることもあります。 この章では、正規表現について詳しく説明します。 この章は、標準正規表現、正規表現のPOSIXクラス、およびメタ文字の3つのセクションに分かれています。

標準正規表現

行頭(^)

正規表現の用語では、キャレット(^)記号は行の先頭に一致します。 次の例では、パターン「The」で始まるすべての行を印刷します。

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

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

The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho

行末($)

行の終わりは、ドル($)記号で表されます。 次の例は、「Coelho」で終わる行を出力します。

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

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

The Alchemist, Paulo Coelho
The Pilgrimage, Paulo Coelho

単一文字(。)

Dot(。)は、行末文字を除く任意の1文字と一致します。 次の例は、文字「t」で終わる3文字の単語すべてを印刷します。

[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p'

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

cat
bat
rat
mat

文字セットに一致([])

正規表現の用語では、文字セットは角括弧([])で表されます。 これは、複数の文字のうち1つだけを照合するために使用されます。 次の例は、パターン「Call」および「Tall」に一致しますが、「Ball」には一致しません。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/p'

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

Call
Tall

排他セット([^])

排他的セットでは、キャレットは角括弧内の文字セットを無効にします。 次の例では、「Ball」のみが出力されます。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/p'

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

Ball

文字範囲([-])

文字範囲が指定されている場合、正規表現は角括弧で指定された範囲内の任意の文字と一致します。 次の例では、「Call」と「Tall」は一致しますが、「Ball」は一致しません。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/p'

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

Call
Tall

次に、範囲を「A-P」に変更し、結果を観察しましょう。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/p'

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

Call
Ball

ゼロオンワンオカレンス(\?)

SEDでは、疑問符(\?)は、直前の文字の0回または1回の出現に一致します。 次の例は、「Behaviour」と「Behavior」に一致します。 ここでは、「\?」を使用して、オプション文字として「u」を作成しました。

[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/p'

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

Behaviour
Behavior

1つ以上のオカレンス(\ +)

SEDでは、プラス記号(\ +)は、直前の文字の1つ以上の出現と一致します。 次の例は、1つ以上の「2」の出現に一致します。

[jerry]$ echo -e "111\n22\n123\n234\n456\n222"  | sed -n '/2\+/p'

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

22
123
234
222

ゼロ以上の発生(*)

アスタリスク(*)は、直前の文字の0回以上の出現と一致します。 次の例は、「ca」、「cat」、「catt」などに一致します。

[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/p'

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

ca
cat

正確にN個の発生\ {n}

\ {n}は、直前の文字の「n」回の出現と完全に一致します。 次の例では、3桁の数字のみを出力します。 ただし、その前に、数字のみを含む次のファイルを作成する必要があります。

[jerry]$ cat numbers.txt

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

1
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000

SED式を記述しましょう。

[jerry]$ sed -n '/^[0-9]\{3\}$/p' numbers.txt

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

100

中括弧のペアは、「\」文字によってエスケープされることに注意してください。

少なくともn個のオカレンス\ {n、}

\ {n、}は、少なくとも「n」個の先行文字に一致します。 次の例は、5桁以上のすべての数値を出力します。

[jerry]$ sed -n '/^[0-9]\{5,\}$/p' numbers.txt

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

10000
100000
1000000
10000000
100000000
1000000000

M to Nオカレンス\ {m、n}

\ {m、n}は、少なくとも「m」、最大で「n」個の先行文字に一致します。 次の例は、5桁以上で8桁以下のすべての数値を出力します。

[jerry]$ sed -n '/^[0-9]\{5,8\}$/p' numbers.txt

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

10000
100000
1000000
10000000

パイプ(|)

SEDでは、パイプ文字は論理OR演算のように動作します。 パイプの両側のアイテムに一致します。 次の例は、「str1」または「str3」のいずれかに一致します。

[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/p'

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

str1
str3

括弧とパイプ(|)のペアは「\」文字でエスケープされることに注意してください。

エスケープ文字

特定の特殊文字があります。 たとえば、改行は「\ n」で表され、キャリッジリターンは「\ r」で表されます。 これらの文字を通常のASCIIコンテキストに使用するには、バックスラッシュ(\)文字を使用してエスケープする必要があります。 この章では、特殊文字のエスケープについて説明します。

「\」のエスケープ

次の例は、パターン「\」に一致します。

[jerry]$ echo 'str1\str2' | sed -n '/\\/p'

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

str1\str2

「\ n」のエスケープ

次の例は、改行文字に一致します。

[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/p'

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

str1\nstr2

「\ r」のエスケープ

次の例は、キャリッジリターンに一致します。

[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/p'

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

str1\rstr2

「\ dnnn」のエスケープ

これは、10進数のASCII値が「nnn」である文字に一致します。 次の例は、文字「a」のみに一致します。

[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/p'

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

a

「\ onnn」のエスケープ

これは、8進数のASCII値が「nnn」である文字に一致します。 次の例は、文字「b」のみに一致します。

[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/p'

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

b

これは、16進数のASCII値が「nnn」である文字に一致します。 次の例は、文字「c」のみに一致します。

[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/p'

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

c

正規表現のPOSIXクラス

特別な意味を持つ特定の予約語があります。 これらの予約語は、正規表現のPOSIXクラスと呼ばれます。 このセクションでは、SEDでサポートされるPOSIXクラスについて説明します。

[:alnum:]

アルファベットと数字を意味します。 次の例では、「One」と「123」のみが一致しますが、タブ文字は一致しません。

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/p'

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

One
123

[:アルファ:]

アルファベットのみを意味します。 次の例では、単語「One」のみに一致します。

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/p'

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

One

[:ブランク:]

これは、空白またはタブのいずれかの空白文字を意味します。 次の例は、タブ文字のみに一致します。

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/p' | cat -vte

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

^I$

コマンド「cat -vte」は、タブ文字(^ I)を表示するために使用されることに注意してください。

[:桁:]

10進数のみを意味します。 次の例では、数字「123」のみが一致します。

[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/p'

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

123

[:下:]

小文字のみを意味します。 次の例は、「1」のみに一致します。

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/p'

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

one

[:アッパー:]

大文字のみを意味します。 次の例は、「TWO」のみに一致します。

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/p'

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

TWO

[:punct:]

スペースまたは英数字以外の文字を含む句読点を意味します

[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/p'

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

One,Two

[:スペース:]

空白文字を意味します。 次の例はこれを示しています。

[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/p' | cat -vte

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

123^L^I$

メタキャラクター

従来の正規表現と同様に、SEDもメタキャラクターをサポートしています。 これらはPerlスタイルの正規表現です。 メタキャラクターのサポートはGNU SED固有であり、SEDの他のバリアントでは機能しない可能性があることに注意してください。 メタキャラクターについて詳しく説明します。

単語の境界(\ b)

正規表現の用語では、「\ b」は単語の境界に一致します。 たとえば、「\ bthe \ b」は「the」に一致しますが、「these」、「there」、「they」、「then」などには一致しません。 次の例はこれを示しています。

[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/p'

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

the

非単語境界(\ B)

正規表現の用語では、「\ B」は非単語境界に一致します。 たとえば、「the \ B」は「these」と「they」には一致しますが、「the」には一致しません。 次の例はこれを示しています。

[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/p'

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

these
they

単一の空白(\ s)

SEDでは、「\ s」は単一の空白文字を意味します。 次の例は「Line \ t1」に一致しますが、「Line1」には一致しません。

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/p'

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

Line 1

単一の非空白(\ S)

SEDでは、「\ S」は単一の空白文字を意味します。 次の例は「Line2」に一致しますが、「Line \ t1」には一致しません。

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/p'

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

Line2

単一の単語の文字(\ w)

SEDでは、「\ w」は単一の単語文字、つまりアルファベット文字、数字、およびアンダースコア(_)を意味します。 次の例はこれを示しています。

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/p'

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

One
123
1_2

単一の非単語文字(\ W)

SEDでは、「\ W」は「\ w」とまったく反対の単一の非単語文字を意味します。 次の例はこれを示しています。

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/p'

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

&;#

パターンスペースの始まり(\ `)

SEDでは、「\」はパターンスペースの始まりを意味します。 次の例では、単語「One」のみに一致します。

[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/p'

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

One

ストリームエディター-便利なレシピ

SEDは、複数の方法で問題を解決できる素晴らしいユーティリティです。 これがUNIXの方法であり、SEDはそれを完全に証明しています。 GNU/Linuxは、日々のタスクを実行するための多くの便利なユーティリティを提供します。 SEDを使用していくつかのユーティリティをシミュレートしましょう。 簡単な問題を難しい方法で解決しているように見えることもありますが、目的はSEDの力を示すことだけです。

猫コマンド

次の例では、各行はデフォルトのワークフローの一部として印刷されます。

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

次の例では、printコマンドを使用してファイルの内容を表示しています。

[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

空の行を削除する

次の例では、「^ $」は空行を意味し、パターン一致が成功すると空行が削除されます。

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'

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

Line #1
Line #2

同様に、次の例は、空でない場合にのみ行を印刷します。

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'

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

Line #1
Line #2

C ++プログラムからコメント行を削除する

サンプルC ++プログラムを作成しましょう。

#include <iostream>
using namespace std;

int main(void)
{
  //Displays message on stdout.
   cout >> "Hello, World !!!" >> endl;
   return 0;//Return success.
}

次に、次の正規表現を使用してコメントを削除します。

[jerry]$ sed 's|//.*||g' hello.cpp

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

#include <iostream>
using namespace std;

int main(void)
{
   cout >> "Hello, World !!!" >> endl;
   return 0;
}

特定の行の前にコメントを追加する

次の例では、行番号3〜5の前にコメントを追加します。

[jerry]$ sed '3,5 s/^/#/' hello.sh

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

#!/bin/bash
#pwd
#hostname
#uname -a
who
who -r
lsb_release -a

WC -lコマンド

「wc -l」コマンドは、ファイルに存在する行数をカウントします。 次のSED式は同じものをシミュレートします。

[jerry]$ sed -n '$ =' hello.sh

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

8

ヘッドコマンド

デフォルトでは、headコマンドはファイルの最初の10行を印刷します。 SEDで同じ動作をシミュレートしてみましょう。

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

テール-1コマンド

「tail -1」は、ファイルの最後の行を出力します。 次の構文は、そのシミュレーションを示しています。

[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ cat test.txt

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

Line #1
Line #2

SEDスクリプトを記述しましょう。

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

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

Line #2

Dos2unixコマンド

DOS環境では、改行はCR/LF文字の組み合わせで表されます。 次の「dos2unix」コマンドのシミュレーションは、DOS改行文字をUNIX改行文字に変換します。 GNU/Linuxでは、この文字は「^ M」(コントロールM)文字として扱われることがよくあります。

[jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt
[jerry]$ file test.txt

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

test.txt: ASCII text, with CRLF line terminators

SEDを使用してコマンドをシミュレートしましょう。

[jerry]$ sed 's/^M$//' test.txt > new.txt   # Press "ctrl+v" followed "ctrl+m" to generate
"^M" character.
[jerry]$ file new.txt

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

new.txt: ASCII text

次に、ファイルの内容を表示します。

[jerry]$ cat -vte new.txt

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

Line #1$
Line #2$

Unix2dosコマンド

「dos2unix」と同様に、UNIXの改行文字をDOSの改行文字に変換する「unix2dos」コマンドがあります。 次の例は、同じシミュレーションを示しています。

[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ file test.txt

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

test.txt: ASCII text

SEDを使用してコマンドをシミュレートしましょう。

[jerry]$ sed 's/$/\r/' test.txt  > new.txt
[jerry]$ file new.txt

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

new.txt: ASCII text, with CRLF line terminators

次に、ファイルの内容を表示します。

Now let us display the file contents.

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

Line #1^M$
Line #2^M$

Cat -Eコマンド

「cat -E」コマンドは、行末をドル($)文字で表示します。 次のSEDの例は、同じもののシミュレーションです。

[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ cat -E test.txt

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

Line #1$
Line #2$

SEDを使用してコマンドをシミュレートしましょう。

[jerry]$ sed 's|$|&$|' test.txt

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

Line #1$
Line #2$

Cat -ETコマンド

「cat -ET」コマンドは、各行の最後にドル記号($)を表示し、TAB文字を「^ I」として表示します。 次の例は、SEDを使用した「cat -ET」コマンドのシミュレーションを示しています。

[jerry]$ echo -e "Line #1\tLine #2" > test.txt
[jerry]$ cat -ET test.txt

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

Line #1^ILine #2$

SEDを使用してコマンドをシミュレートしましょう。

[jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'

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

Line #1^ILine #2$

nlコマンド

「nl」コマンドは、単にファイルの行に番号を付けます。 次のSEDスクリプトは、この動作をシミュレートします。

[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ sed = test.txt | sed 'N;s/\n/\t/'

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

1 Line #1
2 Line #2

最初のSED式は行番号に続いてその内容を出力し、2番目のSED式はこれらの2行をマージして、改行文字をTAB文字に変換します。

cpコマンド

「cp」コマンドは、ファイルの別のコピーを作成します。 次のSEDスクリプトは、この動作をシミュレートします。

[jerry]$ sed -n 'w dup.txt' data.txt
[jerry]$ diff data.txt dup.txt
[jerry]$ echo $?

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

0

展開コマンド

「expand」コマンドは、TAB文字を空白に変換します。 次のコードは、そのシミュレーションを示しています。

[jerry]$ echo -e "One\tTwo\tThree" > test.txt
[jerry]$ expand test.txt > expand.txt
[jerry]$ sed 's/\t/   /g' test.txt > new.txt
[jerry]$ diff new.txt expand.txt
[jerry]$ echo $?

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

0

ティーコマンド

「tee」コマンドは、データを標準出力ストリームおよびファイルにダンプします。 「tee」コマンドのシミュレーションを以下に示します。

[jerry]$ echo -e "Line #1\nLine #2" | tee test.txt
Line #1
Line #2

SEDを使用してコマンドをシミュレートしましょう。

[jerry]$ sed -n 'p; w new.txt' test.txt

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

Line #1
Line #2

cat -sコマンド

UNIXの「cat -s」コマンドは、空の出力行の繰り返しを抑制します。 次のコードは、「cat -s」コマンドのシミュレーションを示しています。

[jerry]$ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt
[jerry]$ cat -s test.txt

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

Line #1
Line #2
Line #3

SEDを使用してコマンドをシミュレートしましょう。

[jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt

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

Line #1
Line #2
Line #3

grepコマンド

デフォルトでは、「grep」コマンドは、パターンマッチが成功すると行を出力します。 次のコードは、そのシミュレーションを示しています。

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt
[jerry]$ grep "Line #1" test.txt

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

Line #1

SEDを使用してコマンドをシミュレートしましょう。

[jerry]$ sed -n '/Line #1/p' test.txt

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

Line #1

grep -vコマンド

デフォルトでは、「grep -v」コマンドは、パターン一致が失敗したときに行を出力します。 次のコードは、そのシミュレーションを示しています。

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt
[jerry]$ grep -v "Line #1" test.txt

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

Line #2
Line #3

SEDを使用してコマンドをシミュレートしましょう。

[jerry]$ sed -n '/Line #1/!p' test.txt

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

Line #2
Line #3

trコマンド

「tr」コマンドは文字を変換します。 以下にシミュレーションを示します。

[jerry]$ echo "ABC" | tr "ABC" "abc"

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

abc

SEDを使用してコマンドをシミュレートしましょう。

[jerry]$ echo "ABC" | sed 'y/ABC/abc/'

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

abc