久しぶりにsedと格闘、InDesignデータを整形する。

sed、それはUNIXユーザならお馴染みの、ストリームエディタプログラムだ。sedはすなわちStream EDitorだね。Windowsで使うには別途準備が必要だが、OS XやLinuxなどUNIX系OSではそのまま使える。

sedなど、もう未来永劫使うことなどないだろうと思っていたブログ主だったが、ひょんなことからまたsedのお世話になることになった。

sed image

sedとは、冒頭のようにstream editorの略。上の図のように、入力されたものを何らかのルールで編集し、出力する。このルールがポイントだ。

用途は、Adobe InDesign(DTPソフトウェア)で書き出したHTMLデータから、もとのテキストファイルを復元するというもの。HTMLなのでタグが大量に絡んでいるのだが、これをスッキリ除去し、適当な記号を付けてテキストデータとして残すのだ。

例えば、こんな感じになっている。

<p class="節見出し">HTMLってなんだろう</p>

これを、こんな感じにしてやる。

■■HTMLってなんだろう

要は、<p class=”節見出し”>ってのを見つけたら、それを■■に置き換えてやるだけだ。さらに、最後の</p>は取ってしまう。

このとき、sedではこのような感じで命令を書く。

sed -e "s/<p class="節見出し">(.+)<\/p>/■■\1/g" <input.txt

-eに続く部分が置き換えのルールだ。ルールは、正規表現で書く。input.txt中に<p class=”節見出し”>と</p>に挟まれた任意の文字列があったら、それを■■で始まるものに置き換える。結果は標準出力(stdout)に出る。

これが最も基本的な使い方だ。

-eに続く内容は、別途テキストファイルにしておけば、ルールを何重にも適用できるなど、複雑な処理ができる。この場合には、

sed -f filter.sed <input.txt

というように、-fを使ってファイル名を指定する。

OS Xのsedは、(…)を使った後方参照を行う場合には、拡張構文である旨の-Eを指定する必要があるそうだ。後方参照はGNUでもPOSIXでも標準であるので、なぜこうなっているのかは不明だ。

sedは奥が深い。調べれば調べるほど、用途が広がる感じがして楽しい。こんなものを発明した人はエライ。これから、積極的に使っていく機会が増えそうだ。そういう意味では、OSが変わったときに微妙に挙動が変わるのが痛い。

コメント