Linux で Sed を使用する方法

Linux で Sed を使用する方法
大量のコードが表示された 2 台のコンピューター モニターの写真。

Sed は、ファイルの作成も編集も行わないシンプルな UNIX プログラムです。入力されたデータを変更し、変更されたデータを出力に表示するだけです。ここでは、UNIX の考え方の概要を簡単に説明し、 の使用の基本を説明しsed、日常のタスクでプログラムを使用する方法の例を示します。

Sed の使い方の基本

Sed は、テキスト データ ストリームを読み取り、変更できるプログラムです。つまり、通常のテキスト エディターとは異なり、sed はコンピューター内のファイルを直接変更しません。代わりに、受信データの「フィルター」として機能し、希望どおりに変換できるようにします。

sed を使い始めるには、まず 5 行以上のテキストを含むファイルを作成します。行間に「改行」文字があることを確認してください。

sed の一般的なコマンドは次のようになります。

sed の最も基本的な機能の 1 つはnサブコマンドです。これは、sed の入力からデータを読み取り、それをプログラムの「パターン スペース」に配置することによって機能します。これは、sed が操作を行う前に、入力されたテキストを保持する特別なバッファーです。

内容を表示する端末

sed のもう 1 つの基本機能は、pサブコマンドです。 と同様にn、これは sed の入力から入ってくるデータを読み取り、それをプログラムのパターン スペースに配置します。ただし、端末の出力にも明示的にデータを印刷します。

サブコマンドの使用はp初心者にとって混乱を招く可能性があります。テキスト入力で実行すると、sed は出力を 2 回印刷するからです。これは、デフォルトでは、sed はパターン スペースがp存在するかどうかに関係なく、自動的にパターン スペースを印刷するためです。

-n フラグなしの p サブコマンドの出力を表示する端末。

この奇妙な動作を無効にするには、-nsed サブコマンドを実行する前にフラグを追加します。

-n フラグを有効にした p サブコマンドの出力を表示する端末。

基本的な説明はこれで終わりにして、次のセクションでは sed を使用してテキスト データを操作するさまざまな方法について説明します。

1. テキストストリームの選択とトリミング

印刷以外にも、sed を使用してデータ ストリームとファイルの両方からテキストを選択してトリミングすることもできます。これを行う最も簡単な方法は、サブコマンドに範囲値を追加することですp

次のコマンドは、sed の範囲構文を使用して、「hello.txt」ファイルの 3 行目から 5 行目を出力します。

特定の行範囲を印刷する sed の機能を示す端末。

pサブコマンドを使用して、テキスト内の隣接していない行を印刷することもできます。たとえば、次の例では、「hello.txt」ファイルの 1 行目と 4 行目を印刷します。

テキスト ファイルから隣接していない行を印刷する sed を示す端末。

2. Sed ストリームからテキストを削除する

Sed は、受信したテキスト ストリームからデータを削除することもできます。これは、大きなファイルから数行のテキストを削除したり、プログラムの出力をクリーンアップして必要な情報のみを表示したりする場合に役立ちます。

これを行うには、d削除する特定の行または範囲とともにサブコマンドを使用します。

sed を使用して隣接していない行を削除するプロセスを示す端末。

テキスト行の印刷と同様に、dサブコマンドは複数行の範囲で機能します。たとえば、次のコマンドは「hello.txt」ファイルから最初の 4 行を削除します。

sed を使用して行の範囲を削除するプロセスを示す端末。

特定の行範囲に一致するだけでなく、正規表現を使用して削除するテキストを検索することもできます。これを行うと、sed は「world」という単語を含む行を検索して削除するように指示されます。

正規表現を入力ファイルの範囲として扱うこともできます。これにより、プログラム内での選択をより柔軟に定義できます。

正規表現パターンに基づいてテキスト行を削除する sed の機能を示すターミナル。

3. Sed ストリームに新しいテキストを追加する

テキストを削除するだけでなく、sed は既存のデータ ストリームに新しいテキストを追加することもできます。本格的なテキスト エディターのレベルではありませんが、この機能は 1 回限りの編集や基本的なテキストの追加に便利です。

新しいテキスト行を追加するには、aコマンドの後に追加したいテキストを指定して sed を実行します。

sed ストリームの最後に 1 行のテキストを追加するプロセスを示す端末。

ファイル全体を sed テキスト ストリームに含めることもできます。そのためには、r追加するファイルの名前を指定したコマンドを使用します。

ファイル全体を sed ストリームの末尾に追加するプロセスを示す端末。

4. Sed でのテキストの検索と置換

sed の最も強力な機能の 1 つは、テキスト ストリームからテキストを検索して置換できることです。テキストの追加や削除とは異なり、これにより、データが UNIX パイプを通過するときに動的に編集できるため、通常のテキスト エディターに比べて柔軟性が大幅に向上します。

まず、sed から変更を加えずにテキスト入力をテスト印刷します。

端末に印刷されている内容

pサブコマンドを に置き換えs、その後に 3 つのバックスラッシュ (/) を追加します。

最初のバックスラッシュと 2 番目のバックスラッシュの間に、一致させたい文字列の構造正規表現を挿入します。たとえば、入力文字列で「wo」で始まる単語を検索するには、次の値を入力します。

テキスト カーソルを 2 番目と 3 番目のバックスラッシュの間に置き、一致した部分を置き換えるテキストを入力します。前のコラムと対照的に、このセクションでは構造正規表現は使用しません。

デフォルトでは、sed は特定の行で一致する最初の文字列のみを置き換えます。テキスト ストリーム内の単語のすべてのインスタンスを置き換えたい場合、これが問題になることがあります。これを修正するには、g式の 3 番目のバックスラッシュの後にオプションを追加します。

sed の置換サブコマンドを表示する端末。

5. テキストデータをホールドスペースにコピーする

Sed は、テキスト データを格納するためにパターン スペースとホールド スペースという 2 つのバッファーを使用します。前者は、テキストが sed 式を通過するときに一時的な場所として機能します。一方、後者は任意のテキスト データを格納できるクリップボードとして機能します。

このアプローチの利点の 1 つは、外部プログラムに依存せずに特定の出力を「保持」できることです。これは、sed を使用して複数ステップのテキスト操作を処理する予定の場合に役立ちます。

ホールド スペースの使用を開始するには、まず、少なくとも数行のテキストを含むファイルがあることを確認します。

pサブコマンドを に置き換えh、ファイル内で sed が一致させる行番号または正規表現値を指定します。これにより、sed は特定のテキスト行を取得して、それをホールド スペースにコピーします。

サブコマンドを使用して、ホールド スペース内に複数行のテキストを保存することもできますH。たとえば、次のコマンドはテキスト ファイルの 3 行目と 4 行目を保存し、それをターミナルに出力します。

sedの複数行のテキストを保持するプロセスを示すターミナル

6. ラベルを使用して Sed でループを作成する

sed は包括的なプログラミング言語ではありませんが、プログラム内でループを作成することは可能です。これは、特定のテキスト入力を継続的に処理する sed 式が必要な場合に便利です。

sed でループを作成するには、まず sed 式のラベルを作成する必要があります。そのためには、:サブコマンドの後に式に使用するラベルを続けて使用する必要があります。

sed 式の一致基準を指定します。私の場合は、入力テキストの各行の末尾まで移動します。

sed が一致を見つけたときに実行する sed サブコマンドを入力し、中括弧で囲みます。次の例では、隣接する 2 つの行を結合し、改行文字をスペースに置き換えてから、式の先頭に戻ります。

ループ内で sed ラベルを使用して改行文字を削除するプロセスを示す端末。

これを拡張して、ほぼすべての種類の入力テキストに一致させることもできます。たとえば、次のコマンドは、sed の拡張正規表現機能を使用して、入力テキストから HTML タグを削除します。

ループを使用してファイル内の HTML タグを削除する sed を表示するターミナル。

7. Sed に永続的な変更を加える

他の UNIX ツールと同様に、sed は出力リダイレクトとパイプを利用できます。これにより、sed を他のプログラムと結合できるだけでなく、変更を永続的に適用することもできます。

次のコード行は、sed コマンドの出力から新しい「welcome.txt」ファイルを作成します。

出力リダイレクトを使用して出力をファイルに保存する sed の機能を示すターミナル。

出力のリダイレクト以外にも、組み込み-iフラグを使用して、ターミナル コンソールに変更を出力する代わりに、現在のファイルを編集することもできます。たとえば、次のコマンドは、テキスト ファイルから改行文字を削除して保存します。

sedの-iフラグが表示されている端末。これにより、プログラムは

ここまでの説明で Linux のコマンド ラインに興味が湧いた方は、現在使用できる最も興味深い Bash プロンプトのいくつかについて説明した以前の記事をお読みください。

画像クレジット: Morgan Richardson (Unsplash経由)。すべての変更とスクリーンショットはRamses Redによるものです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です