Linux sed コマンド
sed(Stream EDitor、ストリームエディタ)は、テキスト変換のための強力なコマンドラインツール(Command Line Tool)です。テキストストリーム上で動作し、正規表現(Regular Expression)や特定のコマンドに基づいて、置換(Substitution)、削除(Deletion)、挿入(Insertion)などの操作を実行します。多くのテキストエディタとは異なり、sed はファイルを開いてインタラクティブなセッションを行う必要がありません。インプットストリーム(Input Stream)を1行ずつ処理し、要求に応じて変更を加え、結果をアウトプット(Output)します。このため、特にシェルスクリプト(Shell Script)において、繰り返しの編集タスクを自動化(Automation)するのに理想的な選択肢となります。ログファイルの解析、データ処理、システム管理の自動化を効率的に行う上で、sed の理解は非常に重要です。
1. sed の基本シンタックスと操作
sed の基本シンタックス(Syntax)は以下の通りです:
sed 'コマンド' インプットファイルここで、コマンド (command) は実行する操作を指定し、インプットファイル (inputfile) は処理対象のファイルです。インプットファイルが指定されていない場合、sed は標準入力(Standard Input)からデータを読み取ります。デフォルト(Default)では、出力は標準出力(Standard Output)に送信され、ターミナル(Terminal)画面にプリントされます。
1.1 置換(s) コマンド
置換コマンド s (Substitution) は、最も頻繁に使用される sed コマンドです。マッチしたパターン(Pattern)を置換ストリング(Replacement String)にリプレイス(置き換え)します。一般的なフォーマットは以下の通りです:
sed 's/パターン/置換内容/' インプットファイル解析:
s: 置換コマンド。パターン(pattern) : 検索する正規表現。置換内容(replacement) : マッチしたパターンをリプレイスするためのストリング。/: デリミタ(Delimiter / 区切り文字)。任意のキャラクター(文字)を使用できますが、通常はフォワードスラッシュを使用します。
サンプル1:基本的な置換
myfile.txt という名前のファイルがあり、内容が以下の通りだと仮定します:
これは test ファイルです。(This is a test file.)
このファイルは testing 目的です。(This file is for testing purposes.)"test" を "sample" に置換するには、以下のコマンドを使用します:
sed 's/test/sample/' myfile.txt出力:
これは sample ファイルです。(This is a sample file.)
このファイルは sampleing 目的です。(This file is for sampling purposes.)注意:各行において、最初に出現した "test" のみが置換されます。
サンプル2:グローバル置換
各行に出現するすべての "test" を置換するには、g (global) フラグ(Flag)を使用します:
sed 's/test/sample/g' myfile.txtサンプル3:異なるデリミタの使用
パターンや置換ストリング内にフォワードスラッシュが含まれている場合、それらをエスケープ(Escape)するのを避けるために、異なるデリミタを使用できます。例えば、デリミタとして # を使用します:
sed 's#this/that#that/this#g' myfile.txtもし myfile.txt に "this/that" を含む行がある場合、それらは "that/this" に置換されます。
1.2 削除(d) コマンド
d (Deletion) コマンドは、特定のパターンにマッチする行、または指定された範囲内の行を削除します。
サンプル1:特定のパターンを含む行を削除
myfile.txt から、単語 "testing" を含むすべての行を削除するには:
sed '/testing/d' myfile.txtサンプル2:指定した行番号の削除
myfile.txt の2行目を削除するには:
sed '2d' myfile.txtサンプル3:連続する複数行の削除
2行目から4行目を削除するには:
sed '2,4d' myfile.txt1.3 挿入(i) と追加(a) コマンド
i (Insertion) コマンドは、マッチしたパターンまたは行番号の行の前にテキストを挿入します。a (Append) コマンドは、マッチしたパターンまたは行番号の行の後にテキストを追加します。
サンプル1:特定の行の前にテキストを挿入
myfile.txt 内の "testing" という単語を含む任意の行の前に、新しい行「testingの前の新しい行」を挿入するには:
sed '/testing/i testingの前の新しい行 (New line before testing)' myfile.txtサンプル2:特定の行の後にテキストを追加
myfile.txt 内の "testing" という単語を含む任意の行の後に、新しい行「testingの後の新しい行」を追加するには:
sed '/testing/a testingの後の新しい行 (New line after testing)' myfile.txtサンプル3:指定した行番号の前後への挿入/追加
2行目の前に「2行目の前の新しい行」を挿入し、2行目の後に「2行目の後の新しい行」を追加するには:
sed '2i 2行目の前の新しい行 (New line before line 2)' myfile.txt | sed '2a 2行目の後の新しい行 (New line after line 2)'1.4 変更(c) コマンド
c (Change) コマンドは、行全体の内容を新しいテキストにリプレイスします。
サンプル1:特定のパターンを含む行を変更
"test" を含む任意の行を「この行は変更されました」に置換するには:
sed '/test/c この行は変更されました (This line has been changed)' myfile.txtサンプル2:指定した行番号の変更
3行目を「これが新しい3行目です」に変更するには:
sed '3c これが新しい3行目です (This is the new third line)' myfile.txt1.5 読み取り(r) と書き込み(w) コマンド
r (Read) コマンドは、別のファイルの内容を読み取り、マッチしたパターンまたは行番号の行の後に追加します。
サンプル:myfile.txt 内の "test" を含む任意の行の後に、otherfile.txt の内容を追加するには:
sed '/test/r otherfile.txt' myfile.txtw (Write) コマンドは、パターンにマッチした行を新しいファイルに書き込みます。
サンプル:myfile.txt 内の "test" を含むすべての行を、test_lines.txt という名前の新しいファイルに書き込むには:
sed '/test/w test_lines.txt' myfile.txt2. sed における正規表現
sed はパターンマッチングにおいて、正規表現に大きく依存しています。正規表現の確かな理解は、sed を効果的に活用するためのキー(Key)となります。
2.1 基礎正規表現のメタキャラクター
| メタキャラクター | 概要 (Description) | サンプル (Example) |
|---|---|---|
. | 改行(Newline)以外の任意の単一キャラクターにマッチ。 | a.c は "abc", "adc", "aec" などにマッチ。 |
* | 直前のキャラクターの0回以上の繰り返しにマッチ。 | ab*c は "ac", "abc", "abbc" などにマッチ。 |
+ (ERE固有) | 直前のキャラクターの1回以上の繰り返しにマッチ。 | ab+c は "abc", "abbc" にマッチするが、"ac" にはマッチしない。 |
? (ERE固有) | 直前のキャラクターの0回または1回の出現にマッチ。 | ab?c は "ac", "abc" にマッチ。 |
[] | ブラケット(角括弧)内の任意の単一キャラクターにマッチ。[a-z] のような範囲指定もサポート。 | [aeiou] は任意の母音にマッチ。 |
[^] | ブラケット内に存在しない任意の単一キャラクターにマッチ。 | [^0-9] は任意の非数字キャラクターにマッチ。 |
^ | 行の先頭(Start of line)にマッチ。 | ^abc は "abc" で始まる行にマッチ。 |
$ | 行の末尾(End of line)にマッチ。 | abc$ は "abc" で終わる行にマッチ。 |
\ | 特殊キャラクターをエスケープし、リテラル(Literal)な意味としてマッチさせる。 | a\.b は "a.b" にマッチ。 |
() (ERE固有) | 正規表現の一部をグルーピング(Grouping)。バックリファレンスによる参照が可能。 | (ab)+ は "ab" の1回以上の繰り返しにマッチ。 |
| | "OR"(論理和)オペレータとして機能。 | abc|def は "abc" または "def" にマッチ。(BREではエスケープが必要だが、EREでは不要)。 |
サンプル1:特定のパターンにマッチ
myfile.txt 内で数字から始まる行を検索するには:
sed -n '/^[0-9]/p' myfile.txt-n オプションはデフォルトの出力を抑制し、p コマンドはマッチした行のみをプリント(Print)します。^ は行の先頭にマッチし、[0-9] は任意の数字にマッチします。
2.2 拡張正規表現(ERE)
デフォルトでは、sed は基礎正規表現 (BRE: Basic Regular Expressions) を使用します。機能が豊富で構文が読みやすい拡張正規表現 (ERE: Extended Regular Expressions) を使用するには、-E オプション(一部のシステムでは -r)を使用します。ERE を利用すると、+、?、|、および括弧 () などのメタキャラクターをエスケープせずに直接使用できます。
サンプル:ERE で | (OR) を使用する
"abc" または "def" を "xyz" に置換するには:
sed -E 's/abc|def/xyz/g' myfile.txt-E がない場合、| をエスケープする必要があります:
sed 's/abc\|def/xyz/g' myfile.txt2.3 バックリファレンス(Backreferences)
バックリファレンス(後方参照)を使用すると、置換ストリング内で以前にマッチしたキャプチャグループ(Capture Group)を参照することができます。これらは \1, \2, \3 などで表され、\1 は最初のキャプチャグループを指し、\2 は2番目、というように続きます。
サンプル:2つの単語の位置をスワップする
"word1 word2" のような行があり、これら2つの単語の順序を入れ替えたいと仮定します。
sed -E 's/([a-zA-Z]+) ([a-zA-Z]+)/\2 \1/g' myfile.txt解析:
([a-zA-Z]+): 1つ以上のアルファベットにマッチし、それをグループ1としてキャプチャ。: 中間のスペースにマッチ。([a-zA-Z]+): 1つ以上のアルファベットにマッチし、それをグループ2としてキャプチャ。\2 \1: マッチしたテキストを、グループ2、スペース、グループ1の順にリプレイス。
3. sed の高度なテクニック
3.1 アドレス(Addresses) メカニズム
アドレスは、sed コマンドがどの行に対して操作を実行すべきかを指定します。行番号や正規表現パターンをアドレスとして使用する例はすでに見てきました。アドレスを組み合わせることで、さらに複雑な条件付けで使用することができます。
サンプル:行番号の範囲とパターンを使用する
5行目から10行目に対してのみ置換コマンドを適用(Apply)するには:
sed '5,10s/old/new/g' myfile.txt"start_pattern" にマッチする行から始まり、"end_pattern" にマッチする行で終わるブロックに対して置換を適用するには:
sed '/start_pattern/,/end_pattern/s/old/new/g' myfile.txt3.2 複数のコマンドを実行する
複数の sed コマンドをチェーン実行するには、いくつかの方法があります:
-e オプションを使用する:
sed -e 's/pattern1/replacement1/g' -e 's/pattern2/replacement2/g' myfile.txtセミコロン ; を使用する:
sed 's/pattern1/replacement1/g; s/pattern2/replacement2/g' myfile.txtスクリプトファイル(Script File) を使用する:
以下のような内容でファイル(例:my_sed_script.sed)を作成します:
s/pattern1/replacement1/g
s/pattern2/replacement2/gその後、以下のように実行します:
sed -f my_sed_script.sed myfile.txtスクリプトファイルを使用するアプローチは、複雑な sed コマンドシーケンスを管理する際に非常に有用です。
3.3 ホールドスペース(The Hold Space)
ホールドスペースは、後で使用するために行を一時的に保存できるバッファ(Buffer)です。sed にはホールドスペースを操作するためのコマンドが用意されています:
h: パターンスペース(Pattern Space:現在の行)の内容をホールドスペースにコピー(上書き)。H: パターンスペースの内容をホールドスペースに追加(アペンド)。g: ホールドスペースの内容をパターンスペースにコピー。G: ホールドスペースの内容をパターンスペースに追加。x: パターンスペースとホールドスペースの内容をスワップ(交換)。
これらのコマンドは非常に強力ですが、最初は少し混乱するかもしれません。
サンプル:行を複製(Duplicate)する
ファイル内のすべての行を複製するには:
sed 'H;G' myfile.txt解析:
H: 現在の行(パターンスペース)をホールドスペースに追加。G: ホールドスペース(元の行が含まれている)をパターンスペースに追加。これにより、パターンスペースには元の行と、それに続く元の行が含まれることになります(複製の完了)。