Linux / コマンド / sed - ストリームでのテキスト検索・置換
sedは、入力を1行ずつ読み取り、編集ルールを適用して結果を出力するストリームエディタです。置換、特定行の選択、削除のような繰り返しのテキスト変換に適しています。
基本的な実行では、元のファイルを変更せず、変換結果を標準出力に出力します。置換コマンドの形式はs/探すパターン/置き換える内容/フラグで、gを付けると1行のすべての一致を置き換えます。
基本的な文法
sed [オプション] '編集コマンド' [ファイル ...]
インストールされている実装とオプションは、配布版によって異なる場合があります。man sedで現在のシステムの説明を確認してください。
使用例
最初の一致の置換
読み取り可能な config.txt を用意します。各行で最初に一致した部分だけを置き換え、画面に表示します。
sed 's/old/new/' config.txt
1行のすべての一致の置換
gフラグを使用します。
sed 's/old/new/g' config.txt
特定の行だけを出力
読み取り可能な log.txt を用意します。-n で自動出力をオフにし、p で5行目から10行目までを両端を含めて出力します。
sed -n '5,10p' log.txt
置換結果とファイル変更の有無
基本のsedは入力を読み取り、変換した結果を標準出力に送信し、元のファイルは変更しません。以下の置換は、各行の最初のredだけをgreenに置き換えます。
printf 'red car\nred red\n' | sed 's/red/green/'
例の出力:
green car
green red
一行のすべての一致を置き換えるには、置換式の末尾にgを付けます。ファイルを直接修正する-iは実装ごとにバックアップ接尾辞の文法が異なるため、重要なファイルはまずバックアップを取り、sed '...' オリジナル > 新しいファイルで結果を確認してから置き換えてください。
特定の行だけを出力するにはsed -n '5,10p' ファイルのように基本出力抑制(-n)と出力コマンド(p)を併用します。sedの正規表現はシェルグロブと異なり、ダブルクォート内ではシェルが$やバックスラッシュを先に解釈することがあります。置換式を作成する際は、クォートや区切り文字も確認してください。
主なオプションと形式
| オプション・形式 | 説明 |
|---|---|
-n |
基本の自動出力をオフにします。 |
-e スクリプト |
編集コマンドを複数指定します。 |
-E |
拡張正規表現を使用します。 |
-i[接尾辞] |
GNUの実装では、ファイルをその場で編集し、必要に応じてバックアップを作成します。 |
使用する際の注意点
sed -iはファイルを実際に変更するので、重要なファイルにはバックアップのサフィックスを使用し、結果を確認してください。GNUとBSDの-iの文法は異なります。検索側は正規表現で、置換側の & は一致全体を表すなど、両側で特殊文字の意味が異なります。文字単位の変換だけなら trによる文字の置換 も適しています。sed ... file > file はシェルが読み取り前に元ファイルを空にするため使用しません。置換が一度も起きなくても正常終了する場合があるので、終了状態だけで目的の変更を確認しないでください。
よくある質問
sedだけを実行すると元のファイルは変わりますか?
通常は元ファイルを変更せず、結果を標準出力へ送ります。-i は指定した元ファイルを編集しますが、別名へのリダイレクトはその出力先だけを書き込みます。バックアップと出力結果を確認してから採用してください。
公式ドキュメント
オプションの正確な動作や実装ごとの違いは、sedに関する公式ドキュメントで確認できます。




