sedとは?Linuxでのストリーム編集コマンドの使い方
sed
(ストリームエディタ)は、Linuxで広く使用されるテキスト処理ツールで、データの検索や置換、削除、挿入などをストリーム(データの流れ)に沿って効率的に行います。
主にコマンドラインから実行され、パイプと組み合わせて他のコマンドと連携することで強力なテキスト操作が可能です。
基本的な使い方として、sed 's/検索パターン/置換文字列/' ファイル名
の形式で特定の文字列を置換することが一般的です。
また、正規表現を使用することで複雑なパターンマッチングも可能です。
例えば、-i
オプションを付けると、ファイルを直接編集することができ、スクリプト内での自動化にも適しています。
さらに、複数の編集コマンドを一度に実行するために、-e
オプションを利用することもできます。
sed
はログファイルの解析、設定ファイルの変更、大量データの一括編集など、多岐にわたる用途で活躍し、その柔軟性と効率性からシステム管理やプログラミングにおいて欠かせないツールとなっています。
sedの概要
sed
(ストリームエディタ)は、LinuxおよびUnix系システムで広く使用されている強力なテキスト処理ツールです。
主にテキストストリームに対する編集操作を自動化するために使用され、ファイル内の文字列の置換、削除、挿入、挿入行の追加など、さまざまなテキスト編集作業を効率的に行うことができます。
sed
はコマンドラインから直接使用できるため、スクリプトと組み合わせて高度なテキスト処理を実現する際にも非常に便利です。
sed
の主な特徴には以下の点が挙げられます:
- パターンマッチング:正規表現を使用して特定の文字列パターンを検出し、操作を実行します。
- ストリーム処理:ファイル全体をメモリに読み込むことなく、順次処理を行うため、大規模なファイルでも効率的に処理可能です。
- 非対話型操作:自動化されたバッチ処理に適しており、スクリプト内での使用が容易です。
これらの特性により、sed
はログファイルの解析、自動化されたテキスト変換、設定ファイルの一括編集など、多岐にわたる用途で活用されています。
基本的なコマンドの使い方
sed
の基本的な操作は、コマンドを指定して入力ストリームに対して編集を行うことです。
以下では、代表的なコマンドとその使用方法について説明します。
s コマンド(置換)
sed
の中で最もよく使用されるコマンドの一つがsubstitute
(置換)コマンドのs
です。
特定のパターンを検出し、指定した文字列に置き換えます。
構文:
sed 's/検索パターン/置換文字列/' ファイル名
例:
ファイル内の「foo」を「bar」に置き換える場合
sed 's/foo/bar/' sample.txt
このコマンドは、sample.txt
の各行に対して最初に出現する「foo」を「bar」に置き換えます。
d コマンド(削除)
特定のパターンに一致する行を削除します。
構文:
sed '/検索パターン/d' ファイル名
例:
「delete」という文字列を含む行を削除する場合
sed '/delete/d' sample.txt
p コマンド(表示)
特定のパターンに一致する行を表示します。
-n
オプションと組み合わせて使用することで、必要な行のみを出力できます。
構文:
sed -n '/検索パターン/p' ファイル名
例:
「error」を含む行だけを表示する場合
sed -n '/error/p' sample.log
複数コマンドの実行
複数の編集操作を一度に実行するには、;
で区切ってコマンドを連結します。
例:
「foo」を「bar」に置き換え、かつ「delete」を含む行を削除する場合
sed 's/foo/bar/; /delete/d' sample.txt
これらの基本コマンドを組み合わせることで、さまざまなテキスト編集タスクを効率的に実行することができます。
よく使われるオプション
sed
には、多様な編集操作を柔軟に行うためのオプションが多数用意されています。
ここでは、特によく使用されるオプションについて詳しく解説します。
-e オプション
複数の編集コマンドを一度に指定する際に使用します。
各コマンドを個別に指定するため、スクリプト内での可読性が向上します。
使用例:
sed -e 's/foo/bar/' -e '/delete/d' sample.txt
-i オプション(インプレース編集)
ファイルを直接編集し、変更をファイルに保存します。
バックアップを取るオプションも併用可能です。
使用例:
sed -i.bak 's/foo/bar/' sample.txt
このコマンドは、sample.txt
内の「foo」を「bar」に置き換え、元のファイルはsample.txt.bak
としてバックアップされます。
-n オプション(サプレッス出力)
通常、sed
は全ての行を出力しますが、-n
オプションを使用すると、明示的に出力を指定した行のみ表示します。
特定の行だけを抽出する際に有用です。
使用例:
sed -n '/error/p' sample.log
このコマンドは、「error」を含む行のみを表示します。
-f オプション(スクリプトファイルの使用)
編集コマンドをスクリプトファイルに記述し、そのファイルをsed
に読み込ませて実行します。
複雑な編集操作を整理して管理する際に便利です。
使用例:
sed -f script.sed sample.txt
ここで、script.sed
には複数のsed
コマンドが記述されています。
-r / -E オプション(拡張正規表現)
デフォルトの正規表現に加え、拡張正規表現を使用可能にします。
より複雑なパターンマッチングを行う際に有用です。
使用例:
sed -E 's/(foo)+/bar/g' sample.txt
このコマンドは、連続する「foo」を「bar」に置き換えます。
これらのオプションを適切に組み合わせることで、sed
の機能を最大限に活用し、効率的なテキスト処理を実現できます。
実践的な使用例
ここでは、sed
を使用した具体的なテキスト編集の実践例をいくつか紹介します。
これらの例を参考にすることで、sed
の応用範囲とその有用性を理解できます。
ファイル内の特定文字列の一括置換
プロジェクト全体の設定ファイルにおいて、特定のURLを新しいものに変更する場合。
例:
sed -i 's/http:\/\/oldsite.com/http:\/\/newsite.com/g' *.conf
このコマンドは、現在のディレクトリ内の全ての.conf
ファイルで「http://oldsite.com」を「http://newsite.com」に置き換えます。
-i
オプションにより、ファイルが直接編集されます。
ログファイルから特定のエラーメッセージを抽出
大量のログファイルから「ERROR」レベルのログのみを抽出したい場合。
例:
sed -n '/ERROR/p' server.log > error_logs.txt
このコマンドは、server.log
から「ERROR」を含む行だけを抽出し、error_logs.txt
に保存します。
CSVファイルの特定列のデータを修正
カンマ区切りのCSVファイルで、2列目のデータに誤りがある場合、それを修正します。
例:
sed 's/^\([^,]*\),oldvalue/\1,newvalue/' data.csv
このコマンドは、各行の2列目が「oldvalue」の場合、「newvalue」に置き換えます。
特定の行の削除
ドキュメント内の特定の章タイトルを含む行を削除する場合。
例:
sed '/^## 応用編/d' manual.md
このコマンドは、manual.md
内で「## 応用編」で始まる行を削除します。
複数の編集操作を同時に実行
一つのコマンドで複数の置換と削除を行う場合。
例:
sed -e 's/foo/bar/g' -e '/delete/d' sample.txt
このコマンドは、sample.txt
内の「foo」を「bar」に全て置き換え、かつ「delete」を含む行を削除します。
テキストの挿入
特定のパターンの前後に新しい行を挿入します。
例:
sed '/INSERT_BEFORE/i\New line before' sample.txt
このコマンドは、「INSERT_BEFORE」を含む行の前に「New line before」を挿入します。
テキストの置換に正規表現を使用
複雑なパターンに基づいて置換を行います。
例:
sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/' dates.txt
このコマンドは、dates.txt
内の日付フォーマットを「YYYY-MM-DD」から「DD/MM/YYYY」に変更します。
これらの実践的な使用例は、sed
が日常的なテキスト編集作業をどれほど効率的に行えるかを示しています。
sed
の強力な機能を理解し、適切に活用することで、複雑なテキスト処理も簡潔かつ迅速に実行できます。
まとめ
この記事では、Linuxで広く利用されているストリームエディタsed
の基本から実践的な使用方法までを詳しく説明しました。
sed
のパターンマッチングやストリーム処理の特性を理解することで、日常のテキスト編集作業を効率化できます。
ぜひ、紹介したコマンドやオプションを活用して、自身のプロジェクトでsed
を活用してみてください。