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に関する公式ドキュメントで確認できます。