sed によるストリーム編集

LinuxBeginner
オンラインで実践に進む

はじめに

Linux でテキストファイルを扱うとき、対話型のテキストエディターを開かずに編集を自動化したいことがよくあります。たとえば、CSV ファイルからヘッダーを削除したり、空行を削除したり、ログファイルから特定範囲の行を抽出したりする場合です。

このような処理には、sed(ストリームエディター)を使用します。

sed は、対話操作を必要としない強力なテキストエディターです。ファイルまたはパイプから入力を読み取り、各行に処理を行って結果を出力します。この「読み取り、変換、出力」というモデルは、Unix で古くから使われている方法で、パイプラインとの相性が特に優れています。

この仕組みが、sed が ストリームエディター と呼ばれる理由です。sed は、全画面エディターで開いたファイルだけでなく、流れてくるテキストも処理できるように設計されています。そのため、シェルのパイプラインや自動化スクリプトに自然に組み込めます。

この実験では、次の方法を学びます。

  1. 行の削除(d):不要なヘッダーやコメントを削除します。
  2. 空行の除去:正規表現を使って空行を除外します。
  3. テキストの挿入(i):ファイルに新しい行を追加します。
  4. 行の表示(p):特定範囲の行を抽出します。

行を削除する

まず、サンプルファイルの内容を確認します。

cat /home/labex/project/data.csv

ファイルの先頭に、# で始まるコメント行が 2 行あることを確認できます。ここでは、この 2 行を削除します。

sed で行を削除するには、d コマンドを使用します。

  • 1d は 1 行目を削除します。
  • 1,2d は 1 行目から 2 行目までを削除します。

行番号で対象を指定することは、sed の基本的な考え方の 1 つです。アドレスによって、コマンドを適用する行または行の範囲を sed に指定し、編集コマンドによって、その対象に対して実行する処理を指定します。

次のコマンドを実行して、ファイルを変更せずに削除結果を確認します。

sed '1,2d' data.csv

出力には、先頭 2 行を除いたファイルの内容が表示されます。ただし、ファイルの内容をもう一度確認してください。

cat data.csv

削除した行がまだ残っていることを確認できます。デフォルトでは、sed は出力を画面(標準出力)に送るだけで、元のファイルは変更しません。これは安全のための動作です。

ファイルに変更を適用するには(「インプレース」で編集するには)、-i オプションを使用します。

sed -i '1,2d' data.csv

変更を確認します。

cat data.csv

これで、ヘッダー行がファイルから完全に削除されています。

空行を除去する

ファイルには、データの構造を分断する空行がまだ含まれています。処理対象のデータファイルに、このような空行が含まれていることはほとんど望ましくありません。

空行を除去するには、削除コマンド(d)と正規表現(Regex)を組み合わせます。

  • ^ は行の先頭に一致します。
  • $ は行の末尾に一致します。
  • ^$ は、先頭から末尾まで何もない行、つまり空行に一致します。

これは、sed が 2 つの要素を組み合わせるよい例です。アドレスパターンと編集操作です。パターン /^$/ で一致する行を選択し、d で選択した行を削除します。

/^$/d というコマンドは、「空のパターンに一致する行をすべて削除する」よう sed に指示します。

次のコマンドを実行して、空行をインプレースで削除します。

sed -i '/^$/d' data.csv

結果を確認します。

cat data.csv

これで、ファイルは空行による間隔のない、まとまったデータ一覧になっているはずです。

テキストを挿入する

不要なコメントを削除できたので、次はファイルに適切な分類ヘッダーを追加します。

i(Insert)コマンドは、指定した行の 前 にテキストを追加します。

  • 1i Text は、1 行目の前に "Text" を挿入します。

a(Append)コマンドは、指定した行の 後 にテキストを追加します。

  • 1a Text は、1 行目の後に "Text" を挿入します。

削除や置換に加えて、i や a のようなコマンドがあることからも分かるように、sed は置換だけを行うツールではありません。テキストが処理される過程で、行を削除、追加、選択して、ストリームの構成を変更できます。

次のコマンドを実行して、ファイルの最上部に "Company Confidential" を挿入します。

sed -i '1i Company Confidential' data.csv

ファイルの内容を確認します。

cat data.csv

新しい行が先頭に挿入され、その結果、他のすべての行が 1 行ずつ下に移動しています。

特定の行を表示する

ファイルを編集せず、特定の行だけを抽出したい場合もあります。sed は、head や tail より柔軟なツールとして使用できます。

デフォルトでは、sed は処理したすべての行を表示します。特定の行だけを表示するには、次の 2 つを行います。

  1. -n オプションを使って自動表示を抑制します(自動表示を無効にします)。
  2. p コマンドを使って、指定した行だけを明示的に表示します。

-n を指定しない場合、sed はすべての行を自動的に表示した後、p の実行時に選択した行をもう一度表示します。そのため、初心者には分かりにくいことがあります。-n を指定するとデフォルトの表示動作が無効になり、指定した内容だけが出力されます。

5 行目から 10 行目までを表示するには、次のコマンドを実行します。

sed -n '5,10p' data.csv

最後の 1 行だけを表示するには、ファイルの末尾を表す $ 記号を使用します。

sed -n '$p' data.csv

この方法は、特定の部分だけを確認したい大きなログファイルを分析するときに非常に便利です。

まとめ

この実験では、sed によるストリーム編集の基本を学びました。

  1. 削除(d):特定の行(1,2d)やパターンに一致する行(/^$/d)を削除します。
  2. 挿入(i):指定した位置で、ファイルストリームにテキストを追加します。
  3. 表示(-n ... p):デフォルトの出力を抑制し、選択した行だけを表示します。
  4. インプレース編集(-i):画面に表示するだけでなく、ファイルを直接変更します。

sed はテキスト処理を自動化するための重要なツールであり、構成管理やログ分析を行うシェルスクリプトで広く使用されています。