Sed (コンピュータ)
sed(セド)は、入力ストリーム(ファイルまたはパイプラインからの入力)に対してテキスト変換などのデータ処理をおこなうために使用されるプログラムである。名称「sed」は「ストリームエディタ」を意味する英語「stream editor」に由来する。
sedは、入力を行単位で読み取り、sedスクリプトと呼ばれるシンプルな命令文に従ってテキスト変換などの編集をおこない、また行単位で出力する。基本的には照合ルールに従い場合分けをおこなうフィルタと捉えることができる。オリジナル版のsedはベル研究所のマクマホンによって1973年前後に開発されたUNIXユーティリティで、現在ではコマンドラインをサポートするさまざまなオペレーティングシステムに搭載されている。
大量のテキストファイルに対して一括で定形の処理をおこなう場合に大きな威力を発揮する。正規表現に対応しており、ある条件の範囲内の文字列を探し出して処理することができる。特定の条件に合った文字列を検索し置換するなどの用途に用いる。
アドレスとは入力データの行を指定するもので、行番号または正規表現パターンのことである。sedのスクリプトはアドレスとコマンドを並べて書いたものである。
アドレス1 コマンド1
アドレス2 コマンド2
アドレス3 コマンド3
:
sedは基本的に、「アドレスで指定された条件を満たす入力データ行を、コマンドで処理して出力する」という動作を全データ行にわたり繰り返す。アドレス指定は省略することができ、その場合には、入力データの行番号や内容に関係なくコマンドが適用される。
例えば、下記のスクリプトは、入力データの10行目のみを出力するものである。
10 p
d
sedはデータを一行だけ読み込み、それをパターンスペースと呼ばれる場所に格納し、パターンスペースのデータに対してスクリプトを順に評価してゆく。まず、スクリプト「10 p」を評価し、入力データ(パターンスペース)の行番号が10である場合に p コマンドによってパターンスペースのデータを出力する。そして次のスクリプト「d」を評価し、入力データの行番号や内容に関係なく無条件に d コマンドを適用し、パターンスペースのデータを削除する。sedはスクリプトの終わりに到達すると、パターンスペースにデータが残っている場合、パターンスペースの内容を出力して、次の入力データの処理に移る。このスクリプトでは、スクリプトの2行目で、パターンスペースのデータが削除されているため、データの出力はせずに次の入力データの処理に移る。
条件によって次の行を読み込んだり、ホールドスペースと呼ばれるバッファに確保して後続の読み込みと合成することもできる。これらを利用するとフォーマット変換や特定の文脈パターンを抽出するなど、かなり高度な処理が可能となる。実際sedはチューリング完全な言語であることが証明されている。
y/検索文字/置換文字/
パターンスペースのある一文字を検索し置換するためには、行頭が <tt>y</tt> から始まるコマンドを用いる。これは一文字単位で検索置換をおこなうので、文字列(単語など)については用いることができない。なお、sedスクリプトにおいてはスラッシュ (/) で挟まれた文字ないし文字列を対象とするので、末尾のスラッシュを省略するとエラーになる。
y/○/●/
y/△/▲/
y/□/■/
このように記述すると、○→●、△→▲、□→■ というように、一文字ずつ置き換える。
だがこれは、次のように一行にまとめることができ、スクリプトの行数を減らすことができる。
y/○△□/●▲■/
y コマンドは、先頭から一対一で実行していくため、
y/○△□/●/
というように、前と後とで字数が合っていない場合はエラーになる。
s/検索パターン/置換文字列/g
単語や文章などに照合するパターンを検索・置換する場合には、<tt>s</tt> から始まるコマンドを用いる。<tt>s</tt> の次の文字(上の例では <tt>/</tt> 文字)が、検索パターンや置換文字列の区切りになる。
上記のように末尾に <tt>g</tt> と指定することで、検索パターンにマッチ(照合)するすべての文字列を置換する。
検索文字列は正規表現で指定する。正規表現が区切り文字を含むときは、<tt>\</tt> 文字を前置きする。上記のように <tt>/</tt> が区切り文字のとき、<tt>/</tt> 文字を検索するなら、<tt>\/</tt> と指定する。
置換文字列では、<tt>&</tt> 文字や <tt>\</tt> 文字が特別な意味をもつ。<tt>&</tt> 文字は、照合した文字列に置き換わる。<tt>&</tt> 文字自体に置換するときは、<tt>\&</tt> と指定し、<tt>\</tt> 文字自体に置換するときは、<tt>\\</tt> と指定する。上記のように <tt>/</tt> が区切り文字のとき、<tt>/</tt> 文字に置換するなら <tt>\/</tt> と指定する。
なお、末尾の <tt>g</tt> という指定を省くと、パターンスペースの中で最初の文字列にだけ検索・置換を実行し、2番目以降は無視する。
通常のワークエリアの事をパターンスペースと呼び、これと対になる裏バッファを持っており、これをホールドスペースと呼ぶ。
ホールドスペースには、次のコマンドが使用できる。
g:パターンスペースにホールドスペースの内容をコピーする。元のパターンスペースの内容は上書きで消される。
G:パターンスペースの末尾にホールドスペースの内容が追加される。パターンスペースの末尾の改行は保持される。
h:パターンスペースの内容をホールドスペースにコピーする。元のホールドスペースの内容は上書きで消される。
H:パターンスペースの内容をホールドスペースの末尾にコピーする。
x:パターンスペースの内容とホールドスペースの内容を入れ替える(交換する)。
sedのインストールされているコマンドライン環境において、以下のように入力することで、データの処理がおこなえる(<tt>入力.txt</tt> を入力ファイル名、<tt>出力.txt</tt> を出力ファイル名とする)。
<tt>sed -e 's/検索文字列/置換文字列/g' 入力.txt > 出力.txt</tt>
Bourne ShellやC Shellでは、あるsedスクリプトを単独で使用する場合、このように入力する(これらのシェルを使用する場合、シングルクォート (<tt>'</tt>) は、ワイルドカードなどのシェルの特殊文字をシェルが解釈してしまわないように付加する)。
<tt>-e</tt> オプションは、「以下に続く文字列をスクリプトとして処理する」指定である。
<tt>入力.txt</tt> の中の、検索条件に照合するすべての文字列を処理し、<tt>出力.txt</tt> というファイルに出力する。
<tt>sed -f スクリプト.sed 入力.txt > 出力.txt</tt>
このように入力することで、予め用意したスクリプトファイルを読み込ませることができる。
<tt>-f</tt> オプションは、「ファイルからコマンドを読み込み処理する」指定である。
スクリプトファイル <tt>スクリプト.sed</tt> 中に記述された命令を順に読み込み、<tt>入力.txt</tt> の中の、検索条件に照合するすべての文字列を処理し、検索条件に照合するすべての文字列を処理し、<tt>出力.txt</tt> というファイルに出力する。
対話型テキストエディタと異なり、処理の経過・内容を逐次ユーザに確認することはない。非対話型であること、複数ファイルを一括して処理できることから、作業は対話型エディタによる逐次処理に比して極めて高速であり、生産性も高い。
プログラムのソースコードや、HTMLファイル中のハイパーリンクを一括して訂正するなどの処理に使用される。また、通常の文章の誤記・表記不統一などを一括して訂正するなどの用途にも使用され、たとえば日本語データの場合、正規表現を用いることで送り仮名を含む文章の処理などに用いられる。
現在ではWindowsやMacintoshなどにも移植されている。基本的にコマンドラインツールだが、これらのOS向けの版では、ユーザーがCUI(コマンドライン)に慣れていないことも考慮し、近年ではGUIで扱うためのツールも提供され始めている。