界面駭客日記(33) - Unix流の文章作成支援 増井俊之


パソコンが最も広く使われている応用分野は恐らく文書の作成でしょう。 私の場合、 ワープロやエディタがなければ全く長い文章を書くことができませんから、 計算機には大変感謝しています。
小さな文書を少しだけ扱う場合は良いのですが、 文章を多量に書いたり、後に残すべきしっかりした資料を作成したいような場合、 単にテキストを入力したり編集したりできるだけでは不充分で、 いろいろな方法でテキストファイルを管理したりチェックしたりする作業が 必要になってきます。 このような場合は 何度も編集作業が必要になりますから、 作業の途中段階でバックアップファイルを作成したり、 変更に応じて異なるバージョン番号を割り当てたりできると便利です。 また、大きなファイルを編集する場合、 文字列を検索したり別の文字列に置換したりする作業もよく必要になります。 バージョンの差分をチェックしたり、 スペルや表記の間違いなどをチェックするといった作業もしばしば必要になります。
パソコンのテキストエディタやワープロを使ってこのような作業を行なおうとする場合、 バージョン管理機能や文字列置換機能など各種の高度な機能を持った ワープロやエディタを使うのが一般的だと思いますが、 特定のエディタの文書管理機能を使用すると別のエディタではその機能を使えない 可能性がありますし、必要なすべての文書管理機能を持つエディタは存在しないかもしれません。 Unixでは、各種の文書管理機能を実現する多くのツールが用意されているため、 単純な機能しかもたないエディタを使う場合でも、 Unixツールを活用することにより様々な方法で文書管理を行なうことができます。 Unixのツールの多くは テキストベースのプログラムの開発を念頭において作成されたものであり、 ソースコードの管理に都合が良いようになっていますが、 普通のテキストの管理にも使えるものが沢山あります。 今回は、文書作成支援に便利なUnixの標準的なツールをいくつか紹介します。

バージョン管理

テキストファイルに限らず、 ファイルを何度も更新したり編集したりする場合、 修正の履歴を保存しておきたいことがよくあります。 修正を行なうたびに異なるファイル名で保存しておくという方法を 使っている人も多いと思いますが、 面倒ですし、保存を忘れたり名前を間違えたりすることもあるので、 あまりうまい管理方法だとはいえません。 本格的に文書を扱う場合は、 いろいろなバージョンのファイルを簡単に操作することができるような バージョン管理システムを使うと便利です。
ソフトウェアの開発を行なう場合、 プログラムのソースコードは頻繁に修正されるのが普通ですし、 古いバージョンの参照が必要になることもよくあるので、 プログラム開発のためのバージョン管理システムが Unixでは古くから広く使用されてきています。 Unixでは古くはSCCS (Source Code Control System)という バージョン管理システムが広く使われていましたが、 その後RCS (Revision Control System)という改良版がよく使われるようになり、 現在はCVS (Concurrent Versions System)というシステムが最も広く使われています。 SCCSやRCSはひとつの計算機上でファイルのバージョン管理を行なうものでしたが、 CVSではネットワーク上のレポジトリでファイルを管理するようになっており、 必要に応じてそこからファイルを自分の計算機にコピーして修正を行なった後、 またレポジトリに書き戻すという手法がとられています。 先月号で「ローカルファイルの終焉」という記事を書きましたが、 CVSでも最も重要な情報はサーバ上に持つようになっており、 ローカルファイルは一時的に編集を行なうために使用されます。
これらのシステムはバージョン管理のための様々な機能を持っていますが、 最も重要なのは、 ユーザが保存を指定したときに適当なバージョン番号を割当てて情報を格納したり、 後でそのバージョン番号を指定することによりそのバージョンのファイルを取得したりする機能です。 これらのバージョン管理システムは、 使っているエディタやワープロの種類に関係なく、 どのようなテキストファイルに対しても適用することができます。 また、CVSの場合はテキストファイル以外に対してもバージョン管理を行なうことができますから、 デジカメ写真の修正履歴を管理することもできます。

文字列検索

ほとんどのワープロやエディタでは 編集中のテキスト内の文字列を検索する機能を持っていますが、 Unixには、 認意のテキストファイルに含まれる文字列パタンを検索することができる grepというコマンドが用意されています。 grepを用いると、特定の文字列やパタンがどのファイルに含まれているのかを 簡単に調べることができますから、 ファイルの中身を全部見なくてもファイルの素性を調べることができます。 たとえば、 以下のようにパタンを指定してgrepコマンドを呼び出すことにより、 index.htmlというテキストファイルの中に出現している jpドメインのURLをリストすることができます。
% grep 'http.*\.jp' index.html

文字列置換

grepコマンドは ファイルに含まれる文字列を検索して表示することしかできませんが、 sedというツールを使うと、 特定の文字列を検索して別の文字列に置き換えるといった様々な文字列処理を 簡単に行なうことができます。 例えば「ユーザインタフェース」のような長い単語を何度も入力するのは面倒ですが、 草稿段階では「UI」と書いておき、最後にまとめて「ユーザインタフェース」に 変換することにすれば、入力の手間を省くことができますし、 間違った綴りを入力したり 場所によって異なる表記を使ったり といったミスを減らすことができます。 例えば以下のようにsedを起動すると、 draft.htmlの中のあらゆる「UI」という文字列を 「ユーザインタフェース」に置換したindex.htmlができます。
% sed 's/UI/ユーザインタフェース/g' draft.html > index.html
文献[1]では、編集作業にsedを利用する方法が詳しく紹介されています。

差分抽出

ファイルの編集を繰り返していると、 バージョン間の違いがよくわからなくなってしまうことがあります。 ふたつのファイルが全く同じかどうかはサイズや作成日付などを見れば判断できますが、 数行だけ違っているような場合は違いをすぐにみつけることができません。 Unixにはふたつのファイルの差分を抽出するdiffというコマンドが用意されているので、 バージョンの異なるふたつのファイルのどこが異なっているのかを すぐに調べることができます。 実は前述のRCSやCVSでは、 同じファイルの異なるバージョンを記憶する場合、 最新ファイルとの差分だけを格納しており、 バージョンの異なる沢山のファイルを管理する場合でも、 多くのディスク容量を消費せずにすむようになっています。

スペルチェック/表記チェック

高機能なエディタやワープロはスペルチェッカ機能を持っていますが、 Unixのコマンドを組み合わせて使うことにより、 スペルチェックや用語チェックのような機能も実現することができます。
英語に関しては、 Unixではspellやispellというスペルチェッカが古くから使われており、 最近はさらに改良を加えたaspell[2]というスペルチェッカがよく使われています。 日本語文書チェッカはあまり広く使われていないようですが、 日本語文書の形態素解析(品詞分解)を行なう chasenやmecabというシステムがフリーで公開されているので、 これらを使って用語のチェックを行なうことができます。 日本語文書に対してmecabを適用すると、 名詞、動詞などの品詞に分解された結果が出力されますから、 例えば以下のようにUnixツールを使って、 結果をソートしたり行数を数えたりすることにより、 どういう単語を使っているかがわかります。
mecab test.txt | sed "s/	.*$//" | sort | uniq -c | sort -r -n

複雑なテキスト処理

UnixではPerlやRubyのようなスクリプト言語を使うことができます。 これらの言語は、 汎用の計算機能を持っていることに加え、 grepやsedと同じようなパタンマッチ機能や複雑な文字列処理機能を持っているため、 小さなプログラムでいろいろな文書処理を行なうができます。 例えば、以下のような簡単なプログラムを書くことにより、 テキスト中に出現したURLをリストするHTMLファイルを作ることができます。
while(<>){
  push(@a,$&) if /http.*html/;
}
for $url (@a){
  print "<li>$url\n";
}

処理の自動化

Unixにはプログラム開発を支援するmakeというツールが用意されています。 大きなソフトウェアを開発する場合、部分的に開発を行なって、 最後にひとつのプログラムにまとめるという作業をすることが多いのですが、 makeを使用すると、変更があった場所だけ再計算を行なったり、 必要な計算だけを指定して必要な処理を実行させることができます。
makeはもともとプログラム作成のために開発されたものですが、 文書の管理はプログラムの管理と似ているところが多いので、 前述のような変換処理などの自動実行の指定にmakeを活用することができます。

Unixツールの入手

LinuxやMacintoshにはではこれらのツールは標準搭載されていますし、 Windowsの場合は、以前紹介したCygwinシステムを導入することによって これらのツールを使うことができるようになります。 またこれらのUnixツールの多くはHandheld PCにも移植されています。
ワープロが無い時代に人はどうやって文章を書いていたのか 私には不思議に思われるのですが、 それと同様に、 Unixツールなしには文章やプログラムをどうやって管理すればいいのかわからないほど 私はこれらのツールに頼って文書を作成したり管理したりしています。 Unixツールはすべてフリーで利用することができますし、、 本格的に文章を作成/管理する場合に有用なツールがそろっているので、 文書の作成/管理にぜひ活用していただきたいと思います。
  1. 浦山毅. 電子編集のススメ sedの活用. 同成社, 1998.
  2. aspell:
    http://aspell.sourceforge.net/

Toshiyuki Masui