コマンド sed は stream editor(ストリームエディタ)の略です。Linux/UNIXシステムで広く普及しているツールです。Sed はそれ自体がテキストエディタではありません。しかし、与えられたテキストを操作するためにさまざまな変更を行うことができます。テキスト入力はストリームとして送信されます。Sed は、そのストリームに対して指示されたアクションを実行します。このガイドでは、gives an overview of the sed コマンドの概要と、Linux でテキストを正常に操作するための操作方法について説明します。
Linux における Sed
入力ストリーム(sed )は、テキストファイルまたは STDIN(標準入力)のいずれかから取得できます。別のコマンドの出力を処理することも、テキストファイルを直接処理することもできます。この sed ツールは、すべての Linux ディストリビューションにプリインストールされています。
Sed の使用方法の概要
この sed コマンドは次の構造に従います。
|
1 |
$ sed <options> <commands> <file> |
デモンストレーション用として、以下はテキスト版の GPL ライセンスバージョン 3 です。:
|
1 |
$ wget https://www.gnu.org/licenses/gpl-3.0.txt |
次の sed コマンドは、テキストファイルの内容を出力します。
|
1 |
$ sed '' gpl-3.0.txt |
ここで、sed はシングルクォーテーション内で記述された操作を実行し、出力を表示しています。オプションが定義されていないため、sed は単に空の操作を実行し、ファイルの内容全体を出力します。
Sed は、別のコマンドからの出力を入力ストリームとして受け取ることもできます。次の例では、GPL v3 テキストファイルの内容を sed にパイプして、空の操作を実行します。
|
1 |
$ cat gpl-3.0.txt | sed '' |
行を出力する方法
オプションを指定しない場合、sed はファイルの内容すべてを直接出力します。代わりに、印刷コマンドを明示的に送信して、結果を標準出力(STDOUT)に直接出力することができます。
出力を印刷するには、文字 p:
|
1 |
$ sed 'p' gpl-3.0.txt |
デフォルトでは、sed は出力を画面に表示します。明示的に印刷コマンドを使用したため、sed は各行を2回出力します。Sed は行単位で動作します。1行を読み込み、特定の操作を実行し、それを出力して、次の行に移動します。
ご覧のように、すべての行が2回出力されています。このように結果が分かりにくい場合は、-n オプションを使用して整理できます。これにより、自動印刷機能が抑制されます。印刷コマンドを送信しているため、デフォルトの出力印刷機能を有効にする必要はありません。
|
1 |
$ sed -n 'p' gpl-3.0.txt |
正規表現の文字クラス
正規表現には、さまざまな文字クラスがあります。これらのクラスにはそれぞれ範囲があります。多くのクラスには複数の表現もあります。ほとんどのクラスは文字の範囲です。
-
- [a-z]: 小文字
-
- [A-Z]: 大文字
-
- [0-9]: 数字
-
- [a-zA-z]: アルファベット
-
- [a-zA-z0-9]: 任意の英数字
これらの文字クラスには、異なる表記法もあります。
-
- [:lower:]: 小文字
-
- [:upper:]: 大文字
-
- [:digit:]: 数字
-
- [:alpha:]: アルファベット
-
- [:alphanum:]: 英数字
たとえば、次のコマンドは、少なくとも1つの数字を含むすべての行を出力します。
|
1 |
$ sed -n 's/[[:digit:]]/&/p' gpl-3.0.txt |
アドレス範囲
処理対象とするテキストストリームの特定の部分を指定できます。それは行の静的な位置、または行の範囲です。最初の例では、GPL v3 テキストファイルから5行目を出力します。
|
1 |
$ sed -n '5p' gpl-3.0.txt |
単一の行の代わりに、処理する行の範囲を指定することもできます。ここでは、sed が処理する5行目から9行目まで(計5行)のアドレス範囲を指定しました。
|
1 |
$ sed -n '5,9p' gpl-3.0.txt |
行アドレスを指定する別の方法もあります。自分で行番号を決定する代わりに、前の例を再構成して、sed が5行目から開始して次の5行に対して操作を実行するようにできます。
|
1 |
$ sed -n '5,+5p' gpl-3.0.txt |
行を指定するもう1つの方法は、インターバル(間隔)を使用することです。次の例では、sed は1行目から開始し、1行おきに操作を実行します。
|
1 |
$ sed -n '1~2p' gpl-3.0.txt |
テキストの削除
これまでは、対象のテキスト行を出力する作業を行ってきました。出力する代わりに、出力から行を削除することもできます。次の例では、先頭から複数の行を削除します。ここでは、次のオプションを使用する必要はありません。-n。なぜなら、sed に削除されていない他のすべてのものを出力させたいからです。行の削除には、次のオプションを使用します。d:
|
1 |
$ sed '1~2d' gpl-3.0.txt |
元のファイルはそのまま残っていることに注意してください。Sed は出力中に行の削除を実行しているだけです。必要に応じて、sed の出力をファイルに保存できます。元のファイルを上書きすることも、別のファイルとして保存することもできます。
|
1 |
$ sed '1~2d' gpl-3.0.txt > gpl-3.0.modified.txt |
出力を手動でファイルに書き込む代わりに、sedは元のファイルを直接編集(インプレース編集)できます。簡単に言うと、sed は元のファイルを編集し、加えられた変更を書き込みます。この方法では元のファイルが上書きされるため、注意して使用する必要があります。
|
1 |
$ sed -i '1~2d' gpl-3.0.txt |
直接編集は危険を伴うため、sed にはバックアップ機能が備わっています。直接編集を行う場合は、編集前にバックアップを作成するために、-i.bak の代わりに -i を使用します。Sed は、バックアップファイルを.bak拡張子で作成します:
|
1 |
$ sed -i.bak '1~2d' gpl-3.0.txt |
テキストの置換
これは、間違いなくsedの最も一般的な実装の1つです。テキストパターンを検索し、そのパターンを指定されたテキストに置換します。ここで、テキストパターンは正規表現(略してregex)で記述されます。正規表現の使用方法について詳しく知るには、ファイル内でGrepと正規表現を使用してテキストパターンを検索する方法を説明しているこのチュートリアルに従ってください。
以下は、正規表現を使用した最も基本的なテキスト置換の例です。
|
1 |
$ 's/<search_pattern>/<replacement>' |
ここで、s は置換のためのコマンドです。スラッシュはパターンと置換テキストの区切り文字(デリミタ)です。実際に動かしてみましょう:
|
1 |
$ echo "hello world" | sed 's/hello/HELLO/' |
次の例では、アンダースコア(_)の使用方法を示します。ここでは、アンダースコアが区切り文字として機能します。
|
1 |
$ echo http://example.com/index.html | sed 's_com/index_net/home_' |
ここでは、com/index を検索して net/home に変更しようとしています。 アンダースコアの位置は非常に重要なので注意してください。たとえば、最後のアンダースコアが抜けていると、sed はエラーをスローします:
|
1 |
$ echo "http://www.example.com/index.html" | sed 's_com/index_net/home' |
置換の練習をするためにダミーファイルが必要です。ここでは、GPL v3テキストファイルを切り取ったバージョンを用意しました:
|
1 |
$ cat gpl-3.0.cropped.txt |
基本的なテキスト置換を実行してみましょう:
|
1 |
$ cat gpl-3.0.cropped.txt | sed 's/GNU/GNU is Not Unix/' |
次の例を見てみましょう。すべての the を THE :
|
1 |
$ echo "the the quick brown fox jumps over the lazy dog" | sed 's/the/THE/' |
何か気づきましたか?Sed はすべての the を変更したわけではありません。 実際には、最初の1つだけです。何が起きているのでしょうか?これはオプション s のデフォルトの動作です。指定された行の最初のインスタンスのみにマッチし、次の行に移動します。確実に sed が検索パターンのために行全体をチェックするようにするには、オプションのフラグ g を使用する必要があります。コマンドを修正してみましょう:
|
1 |
$ echo "the the quick brown fox jumps over the lazy dog" | sed 's/the/THE/g' |
これで意図した通りに動作するようになりました。このコマンドのもう1つの興味深い使い方は、変更するインスタンスの数を指定することです。前の例では、the が3つありましたね。3番目のインスタンスのみを変更するように指定してみてはどうでしょうか?変更はオプションのフラグで行われます:
|
1 |
$ echo "the the quick brown fox jumps over the lazy dog" | sed 's/the/THE/3' |
大きなテキストファイルを扱っている場合、sed が置換の行われた行のみを出力すると便利です。これを実現するには、別の追加フラグであるp:
|
1 |
$ sed -n 's/GNU/GNU is Not Unix/gp' gpl-3.0.txt |
大文字と小文字の区別
デフォルトでは、すべてのsed 操作は大文字と小文字を区別します。次のコマンドは、大文字と小文字を区別するデフォルトの動作を示しています:
|
1 |
$ echo "HELLO WORLD" | sed 's/hello/hElLo/' |
大文字と小文字が一致しないため、変更はありません。このような状況では、sed に大文字と小文字の区別を無効にするよう指示できます。そのためには、オプションのフラグであるi:
|
1 |
$ echo "HELLO WORLD" | sed 's/hello/hElLo/i' |
テキストの置換と参照方法
の強力な機能は、sed 主に正規表現を使用できる能力にあります。より高度で複雑な正規表現パターンを使用することで、さらに多くのことを実現できます。たとえば、ファイルの先頭から特定の場所までのテキストを置換できます。次の式を見てみましょう:
|
1 |
$ sed 's/^.*GNU/GNU_replaced/' gpl-3.0.txt |
ここで、キャレット記号 (^) は行の先頭を表します。任意の文字に一致する演算子は、ピリオド (.) で表されます。アスタリスク (*) はワイルドカード式であり、行の先頭から GNU.
もう一つの興味深いテクニックは、& 記号を使用することです。これを使用して、sed が検索パターンを見つけた領域を強調表示できます:
|
1 |
$ sed 's/^.*GNU/(&)/' gpl-3.0.txt |
最後に
このチュートリアルでは、sed コマンドの基本を学びました。特定の行の出力、テキストの検索、テキストの削除と置換、テキストの上書き、そして正規表現の使用方法を学びました。適切に構築されたsed コマンドは、テキストドキュメントを劇的に変化させることができます。これで、sed.
の助けを借りて、Linuxでのテキスト操作を正常に行うことができます。ハッピーコンピューティング!









コメント
コメントはまだありません。最初のコメントを投稿しましょう。