« Handy 日本語フィードバック | トップページ | またのびてる?、、猫 »

2009年6月11日 (木)

SEDのワナ

2009-06-11(木)雨、曇り、晴れ

 PCとかHP200LXでのテキスト処理にはSEDを使用しています、というか、それしか分かりません。今まではかじった程度でいい加減に使用していましたが、と、あることがあって少し勉強したら、なかなか深いですね。良い勉強になりました。今まで作ったSEDスクリプトも、偶然動いている、なんてのもあるようです。

 SEDは、
・HP200LXの出納帳の出力をEXCELや1-2-3に読ませるためとか、
・予定管理の「あかべこさん作タグスケ」など、あとは
・Pythonスクリプトのコメント部分の削除とかで使用しています。

 今回、タグスケの新バージョンで動かないケースが出て SED.EXE そのものを変更してみました。しかし、SEDそのものの変更には注意が必要なことが分かりました。
 SEDを変えたら、出納帳データの変換が動かなくなったり、ハングアップしているのか悩んだり、色々ありました。

 気をつけるのは

(1)使っている機能の互換性
(2)処理速度
(3)欲しい機能のインプリメント状況

です。なお、(2)の処理速度などは、HP200LXでの固有の問題です。PCであれば、どんなPC でも(HP200LXに比べれば速いから)速度は問題になりません。

 今回比較したのは下記の3件です。

(a)DOS基本セット版(と思う)1990/08/13 29KB
(b)SED242(vectorから)   1992/06/17 25KB
(c)谷本氏の版(vectorから)    1994/06/02 69KB

比較表は下図のとおりです。

Sedcomp

 項番1の速度は15倍の違いがあります。6分近くだとハングアップしているのか、と悩んでしまいます。

 注1: 
 項番3の条件分岐(tコマンド)は、直前の置換コマンドの結果で分岐するか、それ以前の結果が影響するかという問題です。○は直前の結果のみで分岐/非分岐が決まります。×はそれ以前の置換の結果が影響します。○の方が使いやすいのですが、説明ドキュメントの仕様を見ると×の動きが正しいようにも見えます。

 分岐判定フラグ
  ・セット : 置換コマンドの置換が実行されたとき(YESのとき)
  ・リセット: t コマンドの分岐発生時、 あるいは次の行の読み込み時

 これで行くと、置換が発生しなかったときは、フラグは変化しないから、前の置換でのフラグの状態(セットされた状態)が影響します。このため、テスト時、データ出力が無くなって随分と悩みました。

 対策としては、下記のように、間にリセット用のtコマンドを挟むか、tではなく「 /アドレス/コマンド」のフォーマットを使用します。

  s/RE1/PTN1/g
  t DMY
  :DMY
  s/RE2/PTN2/g
  t L10

2行目と3行目はフラグリセット用のtで、分岐してもしなくても4行目へゆくというダミーです。

 項番4のアドレスとコマンド間というのは /ADDR/ と d の間にスペースが許されるかどうかです。これはいずれもOKでした。

 項番5のコマンド間というのは、!とsの間にスペースが許されるかどうかです。記法としてはスペースはないのですが、あっても動くもの(○)と動かないもの(×)があります。タグスケの新バージョンでは、このためSEDによって動いたり動かなかったりで悩みました。

 項番6は正規表現の {m,n} という表現(m回以上、n回以下の繰り返し)がインプリメントされているか否かです。Cの谷本版だけがインプリメントされています。

 ということで、勉強になりました。因みに、SEDは通常はSED242を使用して、{m,n} が必要なときだけ、谷本氏の版を使用することにしました。

 

|

« Handy 日本語フィードバック | トップページ | またのびてる?、、猫 »

PDA」カテゴリの記事

アプリケーション」カテゴリの記事

パソコン・インターネット」カテゴリの記事

コメント

Masa さん 今晩は!
タグスケのversion up大変お世話になりました。SED.EXE の比較表、大変参考になります。私の場合、Masaさんのように精密な比較をした経験があリませんでした。sed242と谷本版にこれほどの速度差があるとは知りませんでした。以後、私もsed242を使うことにします。私は、SED.EXEをタグスケを動かす場合にしか使っていません。私の場合、Masa さんのように多方面でSED.EXEを使うことをしていません。従って、{m,n} という正規表現については使用経験がありません。

以下のようにSEDの教科書の上でのみ、{m,n} という正規表現の知識を知っているだけです。
1.テキストデータ料理学60頁によると、 perlの正規表現の中にこれがあるそうです。使用実例の例示が示されています。
2.unixのsedの場合。GNU SEDに、基本正規表現の他に拡張正規表現が使えて、{m,n}は拡張正規表現の中に入っているそうです(美吉明浩著、「
GREP,SED,AWK」166頁)。
 

投稿: akabeko | 2009年7月25日 (土) 00時49分

今日は。
私も、タグスケのテストで初めて、SEDの違いを知りました。よほどの大量データをHP200LX上で処理するのでなければ、谷本版のまま行くつもりでした。が、出納帳データは、年の後半になると大量のデータになるので、、、。
こういう件を忘れた頃に問題になるようなことがあると慌てるので、メモのつもりで書いてみました。

投稿: masa | 2009年7月25日 (土) 09時27分

コメントを書く



(ウェブ上には掲載しません)




« Handy 日本語フィードバック | トップページ | またのびてる?、、猫 »