Sed (コンピュータ)

Article on other languages:

del.icio.us del.icio.us
Digg Digg
Furl Furl
Reddit Reddit
Rojo Rojo
Add to OnlyWire

sed (セド)は、UNIXで生まれ、コマンドライン環境で使われる、定型的なテキストデータの処理を行うプログラム

sedはStreamEDitorに由来し、おなじくUNIX上の対話型テキストエディタed」のStream版、すなわち非対話版である。

このプログラムは、入力ファイルを行単位で読み取り、sedスクリプトと呼ばれるシンプルな命令文に従って置換などの編集をおこない、また行単位で出力する。基本的にはマッチルールに従い場合分けをおこなうフィルタと捉えることができる。オリジナル版のsedはベル研究所のマクマホンによって1973年前後に開発されたUNIXユーティリティで、現在ではコマンドラインをサポートするさまざまなオペレーティングシステムに搭載されている。

大量のテキストファイルに対して一括で定形の処理を行う場合に大変な威力を発揮する。正規表現に対応しており、ある条件の範囲内の文字列を探し出して処理することが可能。特定の条件に合った文字列を検索し置換するなどの用途に用いる。

しかしあまりに簡略化された機能と文法は取っ付きが悪く、近年ではPerlなどのより高級な言語を用いるケースが増えているようだ。

目次

sedスクリプトの基本的な文型

アドレスとコマンド

sedのアドレスとは、ある行番号ないし正規表現パターンにマッチする行のことである。sedの文はアドレスとコマンドの組であり、"基本的"に「アドレスがマッチした文に従い行をコマンドで処理して出力する」という動作を全行にわたり繰り返すことで動作する(アドレスを省略した場合は全行にマッチする) 例えば次の例は入力の10行目のみを出力して他を削除するsedスクリプトである。

10 p
d

pはprint、dはdeleteの意味だが、「加工されなかった行はそのまま出力する」というsedのルールがあるため、それ以外の行は明示的に削除しなければならない。厳密に言うとpは出力を行うだけで次のサイクルに移らないため、実際には10行目も削除している(dがなければ二重出力される)。

"基本的に"というのは、条件によって次の行を読み込んだり、「ホールドスペース」と呼ばれるバッファに確保して後続の読み込みと合成することができるからである。これらを利用するとフォーマット変換や特定の文脈パターンを抽出するなど、かなり高度な処理が可能となる。実際sedはチューリング完全な言語であることが証明されている。

yコマンド

y/検索文字/置換文字/
ある1文字を検索し置換するためには、行頭がyから始まるコマンドを用いる。これは1文字単位で検索置換をおこなうので、文字列(単語など)については用いることができない。なお、sedスクリプトにおいてはスラッシュ( / )で挟まれた文字ないし文字列を対象とするので、末尾の / を省略するとエラーになる。
y/○/●/
y/△/▲/
y/□/■/
このように記述すると、○→●、△→▲、□→■ というように、1文字ずつ置き換える。
だがこれは、次のように1行にまとめることができ、スクリプトファイルの行数を減らすことができる。
y/○△□/●▲■/
yコマンドは、先頭から一対一で実行していくため、
y/○△□◇/●▲■/
というように、前と後とで字数が合っていない場合はエラーになる。

sコマンド

s/検索文字列/置換文字列/g
単語や文章など、文字列検索置換する場合には、行頭がsから始まるコマンドを用いる。
上記のように記述することで、検索条件にマッチ(適合)するすべての文字列を置換する。
検索文字列には正規表現が使える。
なお、末尾の g という記号(フラグ)を除くと、その行の中で最初の文字列にだけ検索・置換を実行し、2番目以降は無視する。

ホールドスペースの利用

通常のワークエリアの事をパターンスペースと呼び,これと対になる裏バッファを持っており,これをホールドスペースと呼ぶ. ホールドスペースには,次のコマンドが使用できる.

  • g:パターンスペースにホールドスペースの内容をコピーする.元のパターンスペースの内容は上書きで消される.
  • G:パターンスペースの末尾にホールドスペースの内容が追加される.パターンスペースの末尾の改行は保持される.
  • h:パターンスペースの内容をホールドスペースにコピーする.元のホールドスペースの内容は上書きで消される.
  • H:パターンスペースの内容をホールドスペースの末尾にコピーする.
  • x:パターンスペースの内容とホールドスペースの内容を入替える(交換する).

これらの命令文(スクリプト)は、次のように単独で使用しても良いが、拡張子.sedにした(しなくてもよい)テキストデータ(これをスクリプトファイルと呼ぶ)を用意して、後述の-fオプションを用いて読み込ませることで、さらなる効率化と、スクリプトの再利用が図れる。

コマンドラインでの実行

sedのインストールされているコマンドライン環境において、以下のように入力することで、データの処理がおこなえる。(○○○○.txtを入力ファイル名、○○○○.newを出力ファイル名とする。)

sed -e 's/検索文字列/置換文字列/g' ○○○○.txt > ○○○○.new
Bourne ShellC Shellでは、あるsedスクリプトを単独で使用する場合、このように入力する(これらのシェルを使用する場合、シングルクォート(')は、正規表現をシェルが解釈してしまわないように付加する)。
-eオプションは、「以下に続くスクリプトを用いて処理する」命令である。
○○○○.txtの中の、検索条件にマッチするすべての文字列を置換し、○○○○.newというファイルに出力する。
なお、必ずしも出力先を.newとする必要はなく、他の拡張子でも構わない。このとき○○○○.txt > ○○○○.txt などのように、出力先ファイルの名前も同じにすると、シェルの設定によっては、指定したファイルは、元の内容が読み込まれる前に、新しい出力先として長さ0に初期化されてしまうため、入力の内容が無くなり、結局空の内容が得られることになる事がある。(以下同)
sed -f ▽▽▽▽.sed ○○○○.txt > ○○○○.new
このように入力することで、予め用意したスクリプトファイルを読み込ませることができる。
-fオプションは、「ファイルからの読み込んで処理する」命令である。
スクリプトファイル▽▽▽▽.sedの中にあるすべての命令を1行目から順に拾い出し、○○○○.txtの中の、検索条件にマッチするすべての文字列を置換する。
▽▽▽▽.sedが存在しない場合はエラーとなる。

特徴

対話型テキストエディタと異なり、処理の経過・内容を逐次ユーザに確認することはない。そのため処理の指示(スクリプト)に誤りがある場合、ユーザは大量の誤処理と直面することになるが、出力先を新規ファイル(上記の例の場合、.newファイル)として上書きを避け、指示内容を訂正することで対応できる。非対話型であること、複数ファイルを一括して処理できることから、作業は対話型エディタによる逐次処理に比して極めて高速であり、生産性も高い。

プログラムのソースコードや、HTMLファイル中のハイパーリンクを一括して訂正するなどの処理に使用され、プログラマには必須とも言われる。一方それだけでなく、通常の文章の誤記・表記不統一などを一括して訂正するなどの用途にも用いることができる。日本語の場合、正規表現を用いることで送り仮名を含む文章を処理できる。(この記事のノートにあるリンク先を参照)

現在ではWindowsMacintoshなどにも移植されている。基本的にコマンドラインツールだが、これらのOS向けの版では、ユーザーがCUI(コマンドライン)に慣れてないことも考慮し、近年ではGUIで扱うためのツールも提供され始めている。

関連項目

参考文献

外部リンク

This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.


Giant Panda

Mercedes Car
James Bond Guide
This site monitored by SitePinger.net