Linux で Sed を使用する方法
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
sed サブコマンドを実行する前にフラグを追加します。
基本的な説明はこれで終わりにして、次のセクションでは sed を使用してテキスト データを操作するさまざまな方法について説明します。
1. テキストストリームの選択とトリミング
印刷以外にも、sed を使用してデータ ストリームとファイルの両方からテキストを選択してトリミングすることもできます。これを行う最も簡単な方法は、サブコマンドに範囲値を追加することですp
。
次のコマンドは、sed の範囲構文を使用して、「hello.txt」ファイルの 3 行目から 5 行目を出力します。
p
サブコマンドを使用して、テキスト内の隣接していない行を印刷することもできます。たとえば、次の例では、「hello.txt」ファイルの 1 行目と 4 行目を印刷します。
2. Sed ストリームからテキストを削除する
Sed は、受信したテキスト ストリームからデータを削除することもできます。これは、大きなファイルから数行のテキストを削除したり、プログラムの出力をクリーンアップして必要な情報のみを表示したりする場合に役立ちます。
これを行うには、d
削除する特定の行または範囲とともにサブコマンドを使用します。
テキスト行の印刷と同様に、d
サブコマンドは複数行の範囲で機能します。たとえば、次のコマンドは「hello.txt」ファイルから最初の 4 行を削除します。
特定の行範囲に一致するだけでなく、正規表現を使用して削除するテキストを検索することもできます。これを行うと、sed は「world」という単語を含む行を検索して削除するように指示されます。
正規表現を入力ファイルの範囲として扱うこともできます。これにより、プログラム内での選択をより柔軟に定義できます。
3. Sed ストリームに新しいテキストを追加する
テキストを削除するだけでなく、sed は既存のデータ ストリームに新しいテキストを追加することもできます。本格的なテキスト エディターのレベルではありませんが、この機能は 1 回限りの編集や基本的なテキストの追加に便利です。
新しいテキスト行を追加するには、a
コマンドの後に追加したいテキストを指定して sed を実行します。
ファイル全体を sed テキスト ストリームに含めることもできます。そのためには、r
追加するファイルの名前を指定したコマンドを使用します。
4. Sed でのテキストの検索と置換
sed の最も強力な機能の 1 つは、テキスト ストリームからテキストを検索して置換できることです。テキストの追加や削除とは異なり、これにより、データが UNIX パイプを通過するときに動的に編集できるため、通常のテキスト エディターに比べて柔軟性が大幅に向上します。
まず、sed から変更を加えずにテキスト入力をテスト印刷します。
p
サブコマンドを に置き換えs
、その後に 3 つのバックスラッシュ (/) を追加します。
最初のバックスラッシュと 2 番目のバックスラッシュの間に、一致させたい文字列の構造正規表現を挿入します。たとえば、入力文字列で「wo」で始まる単語を検索するには、次の値を入力します。
テキスト カーソルを 2 番目と 3 番目のバックスラッシュの間に置き、一致した部分を置き換えるテキストを入力します。前のコラムと対照的に、このセクションでは構造正規表現は使用しません。
デフォルトでは、sed は特定の行で一致する最初の文字列のみを置き換えます。テキスト ストリーム内の単語のすべてのインスタンスを置き換えたい場合、これが問題になることがあります。これを修正するには、g
式の 3 番目のバックスラッシュの後にオプションを追加します。
5. テキストデータをホールドスペースにコピーする
Sed は、テキスト データを格納するためにパターン スペースとホールド スペースという 2 つのバッファーを使用します。前者は、テキストが sed 式を通過するときに一時的な場所として機能します。一方、後者は任意のテキスト データを格納できるクリップボードとして機能します。
このアプローチの利点の 1 つは、外部プログラムに依存せずに特定の出力を「保持」できることです。これは、sed を使用して複数ステップのテキスト操作を処理する予定の場合に役立ちます。
ホールド スペースの使用を開始するには、まず、少なくとも数行のテキストを含むファイルがあることを確認します。
p
サブコマンドを に置き換えh
、ファイル内で sed が一致させる行番号または正規表現値を指定します。これにより、sed は特定のテキスト行を取得して、それをホールド スペースにコピーします。
サブコマンドを使用して、ホールド スペース内に複数行のテキストを保存することもできますH
。たとえば、次のコマンドはテキスト ファイルの 3 行目と 4 行目を保存し、それをターミナルに出力します。
6. ラベルを使用して Sed でループを作成する
sed は包括的なプログラミング言語ではありませんが、プログラム内でループを作成することは可能です。これは、特定のテキスト入力を継続的に処理する sed 式が必要な場合に便利です。
sed でループを作成するには、まず sed 式のラベルを作成する必要があります。そのためには、:
サブコマンドの後に式に使用するラベルを続けて使用する必要があります。
sed 式の一致基準を指定します。私の場合は、入力テキストの各行の末尾まで移動します。
sed が一致を見つけたときに実行する sed サブコマンドを入力し、中括弧で囲みます。次の例では、隣接する 2 つの行を結合し、改行文字をスペースに置き換えてから、式の先頭に戻ります。
これを拡張して、ほぼすべての種類の入力テキストに一致させることもできます。たとえば、次のコマンドは、sed の拡張正規表現機能を使用して、入力テキストから HTML タグを削除します。
7. Sed に永続的な変更を加える
他の UNIX ツールと同様に、sed は出力リダイレクトとパイプを利用できます。これにより、sed を他のプログラムと結合できるだけでなく、変更を永続的に適用することもできます。
次のコード行は、sed コマンドの出力から新しい「welcome.txt」ファイルを作成します。
出力のリダイレクト以外にも、組み込み-i
フラグを使用して、ターミナル コンソールに変更を出力する代わりに、現在のファイルを編集することもできます。たとえば、次のコマンドは、テキスト ファイルから改行文字を削除して保存します。
ここまでの説明で Linux のコマンド ラインに興味が湧いた方は、現在使用できる最も興味深い Bash プロンプトのいくつかについて説明した以前の記事をお読みください。
画像クレジット: Morgan Richardson (Unsplash経由)。すべての変更とスクリーンショットはRamses Redによるものです。
コメントを残す