ニフティの過去ログを見ていて、私には理解できない記述を見かけました。 こういう演算子です。 ↓ [=<, スタック操作後の代入、だとは思うのですが、その次の不等号がわかりません。 二項演算子だとすると項の指定が無いのはおかしい。 それとも、説明書には無いけど、「=<」で一つの演算子なんでしょうか。 であれば、何をするものですか?
わたしには論理的に説明できないのですが… 演算子の優先順位を逆手に取って,1バイト短く記述する「技術」のようですね。自分にも他人にも解りやすく書くことに反して,トリッキーな「遊び」を楽しんだというところでしょうか。 例えば, ポインタ演算子を使って p..0 の指す値をプッシュしようとして p..0[, のように書くと,プッシュ・ポップ演算子の優先順位が非常に高いために 0 と [ が強く結合して,p..0 ではなく 0 がプッシュされてしまいます。 このため (p..0)[, のように括弧でくくると,今度は (p..0) がp..0を評価する式となり [ と離れてしまいます。 そのため,p..0 をプッシュする場合は,((p..0)[, のように括弧をさらに前置した式で記述せざるを得ません。9バイトになります。 一方, p..0[=<, とすると代入演算子の優先順位は低いため,p..0 と [= は結合します。それじゃ < は何だというと,「この場合に」無害なコードだというところでしょうか。こちらは p..0 の指す値をプッシュした上で何も代入しません。上と同じ結果を得られて8バイトと1バイト短くなります。 あくまでも「遊び」なので,楽しめる人と,楽しめない人がいると思います。わたしはどちらかというと,後者です。…と言うと何か主義があるように聞こえるかもしれませんが,単純に遊びを理解できないだけです。 なお,「以下」は <= であり,=< という演算子はありません。 もしかすると,演算子の優先順位や式の意味を確実に理解していれば,遊びではなくなるのかもしれません。好き好きですね。
> なお,「以下」は <= であり,=< という演算子はありません。 そうですよね。 そこまではわかっていたのですが、だからこそ、私の混乱の出発点になったのです。が、> わたしには論理的に説明できないのですが… めざらさんをしてそのようなものであったとは。 私にわかるわけが無いですね。 とりあえず> 演算子の優先順位を逆手に取って,1バイト短く記述する「技術」のようですね。 このようなものであるとわかれば、使わないという選択肢が取れます。 どうもありがとうございました。
[4288 ]
Re^2: 何かが省略されている?
文太
2013/02/17(Sun) 21:18
[
4286 ]へのコメント
めざらさん、 素晴らしい! ポインタを忘れてしまい、「僕の人生にはポインタは要らないのだなぁ」などと、つい先日、思っていたところでした。実用使い捨てマクロと使い捨てsedスクリプトを量産していたときですね(だいたいにおいて、気分は荒れている)。 さすがです。ものすごく明晰な説明。一部、ポインタを思い出しました。m(__)m 使わないと使えるようにはならないのだけど。 そうか、そうか、「評価」しちゃうんだねぇ。そういう意味だったねぇ、と。 < については、は、初めて見ました。なんじゃ、そりゃ、って感じです。 いずれにせよ、お見事です。勉強になりました。
[4289 ]
ちょっとだけ、sed testコマンドについて
文太
2013/02/25(Mon) 14:03
[
4288 ]へのコメント
完全に文脈に沿ってなくて、そうとうに個人的なメモというか思い出なのですが。 sedのtestコマンド(t)について、ちょっと書かせていただきます。 生まれて初めて、有効に使いました。 s/はじめて\([でだの]\)/◆初めて\1/ s/生まれてはじめて/◆生まれて初めて/g tx s/初めて\([^のなでだ]\)/◆はじめて\1/g :x 原稿の表記揃えというのは、そもそも大変な作業なのですが、「初めて」「始める」「始まる」というのは、表記の統一という点からいうと、かなりハードルの高い表記になります。 そこで、複数の人が参加する本では、なるたけ開いて「ひらがな」にしてしまう、というのがよく使われる手です。 でも、「初めて」を開くと格好が悪い場合も多いのです。 そこで、そうとうルールは面倒なのですが「初めての」とか「初めてだった」みたいなのは、漢字を使うことにしました(細かい話はどうでもよい)。 で、sed testコマンド。 上の例だと、2行目の置換が成功したときのみラベルジャンプして、3行目の置換を飛ばしています。「置換が成功したら」の部分にテストが入っているわけです。 似た例に branch(分岐)コマンドというのがあって、ラベルジャンプさせるか、スクリプト末に制御を飛ばすことができます。こっちは割と頻用されるかと思います。 /有望な時/b toki s/\([^同産]\)時に/\1●ときに/g :toki なんて方法で、「時に」→「ときに」変換の例外処理をします。 もちろん、これらの例は、たまたま僕のところにあった原稿内での話なので、検索文字列とかその正規表現などには、汎用性はありません。「産時に」って何? ということになりますから。
[4291 ]
Re: ちょっとだけ、sed testコマンドについて
masa
2013/02/25(Mon) 22:01
[
4289 ]へのコメント
私も家計簿データの整理にSEDを多用しています。で、落ちた罠をひとつ、、。
> s/はじめて\([でだの]\)/◆初めて\1/ > s/生まれてはじめて/◆生まれて初めて/g > tx > s/初めて\([^のなでだ]\)/◆はじめて\1/g > :x 例のように、2行の置換の次ぎにtコマンドを使うと、使用するSEDモジュールによってtコマンドの挙動が違うものがあります。具体的にいうと、2行目の置換が発生しなかったときのtコマンドの分岐が、1行目の置換の結果に左右されるのです。tが参照するフラグのセット、リセットの動作の作り込みの違いのようです。
詳細を写すのが面倒だったので参照先のブログアドレスを張ります(手抜きで済みません)。
http://masaland.cocolog-nifty.com/blog/2009/06/sed-a511.html 上記の記事の注1の部分です。
[4292 ]
Re^2: ちょっとだけ、sed testコマンドについて
文太
2013/02/26(Tue) 10:12
[
4291 ]へのコメント
masaさん
的確なご指摘、ありがとうございました。
sedのヴァージョンが「谷本版」以外、重ならないようですが、ご指摘、どんぴ
しゃりでした。回避策のDAMMYジャンプ(フラグ・クリア)も的確です。
ただ、ちょっと気になるのは、「前置換でのフラグが残る」という解釈なんで
すよね。masa さんの現象解析は、そのまま再現したと思うのですが、「何かの
理解が間違っているからかも」とも考えています。
僕の試したのは、古い serow 版(たぶん日本でいちばん流通している)と、GNU
の sed が2種です。Onigsed はかなり特殊なのですが、谷口版のオリジナルは
世界中で使われているはず。だとすると、GNU の仕様か、何かの解釈の違いかな、
とも思っています。そのうち適当な場所で聞いてみますね。
もっとも、ローカルには、つまり僕個人にとっては、やばいことになるところ
だったので、とても助かりました。
以下のテストをするのも、こんがらがって大変でした。masaさんの解析をなぞ
るのさえ、すごく大変だったということです。
その他、/address/d のスペースとか、気持ち、すごく良くわかります。
b(ranch)のラベルが同じケースですが、こちらはあっても大丈夫なようでした
(serow版、Bruce.版)。txは、サンプルがそうしていたので、そのままです。
{m,n}については、たしかにserow版(古い)では実装されていませんね。
--- t1.txt --- ;対象テキスト
あ い う
--------------
--- t1.sed --- ;【あるべき形】
s/あ/か/ ;必ず置換する 置換成功 フラグ・オン
s/い/き/ ;2行目で成功して、 &クリアのはず
tx
s/う/く/ ;3行目は置換され【ない】
:x
--------------
>oldsed -f t1.sed t1.txt (serow版)
か き う
>sed -f t1.sed t1.txt (谷本版)
か き う
>onigsed -f t1.sed t1.txt |to (Bruce.版)
か き う
--- t2.sed --- ;【困ってしまうテスト】
s/あ/か/ ;必ず置換する 置換成功 フラグ・オン &クリアのはず
s/B/き/ ;置換失敗
tx ;〔フラグ・オンが残ると、3行目が置換され【ない】〕▼
s/う/く/ ;テストはスルーして3行目は置換され【る】
:x
--------------
>oldsed -f t2.sed t1.txt
か い く
>sed -f t2.sed t1.txt ▼
か い う
>onigsed -f t2.sed t1.txt |to ▼
か い う
--- t3.sed --- ;【DAMMY回避策】
s/あ/か/ ;必ず置換する 置換成功 フラグ・オン
tDAMMY ;DAMMY ラベルを入れてみる フラグ・クリア
:DAMMY
s/B/き/ ;置換失敗
tx ;〔フラグ・オンが残ると、3行目が置換され【ない】〕
s/う/く/ ;テストはスルーして3行目は置換され【る】■
:x
--------------
>oldsed -f t3.sed t1.txt
か い く
>sed -f t3.sed t1.txt ■
か い く
>onigsed -f t3.sed t1.txt |to ■
か い く
[4293 ]
Re^3: ちょっとだけ、sed testコマンドについて
文太
2013/02/26(Tue) 11:08
[
4292 ]へのコメント
masaさん、分かりました。 masaさんの考えたことは正しいです。僕の「解釈」が間違ってました。 ちょっと、ややこしいのですが。 結論から言うと、DAMMYジャンプを必要とするのが実装としては正しく(GNUにバグはない)、serow版その他が「親切すぎる」か「親切すぎて正しくない」のです。 以下は、Lee E. McMahonという人の古典的なsed解説のからの引用です。同じ内容は、各所のsed解説で見ました。 (2)t<label> -- test substitutions. The t function tests whether 【any】 successful substitutions have been made on 【the current input line】; if so, it branches to <label>; if not, it does nothing. ★The flag which indicates that a successful substitution has been executed is reset by: 1) reading a new input line, or 2) executing a t function. ポイントは、処理する対象ファイルの同一行で「置換が成功していたら」フラグが立って、(あるなら)testコマンドが実行されジャンプする。スクリプト内ではない、ということ。 上の英文の最後を見ると、フラグのリセットは、(1)新しい行を読み込むか、(2)テストコマンドをさらに実行したとき、です。 masaさんのダミー作戦は、まったくの正攻法でした。 masaさんには不必要なことなので、独り言になりますが、sedの動きを簡単に書いておきます。 sedは、処理対象となるファイルの1行読み込んでは、スクリプトのコマンドを先頭から最後まで全部実行します。スクリプトの最後にいったら、対象ファイルの次の1行を読み込み、またもう一度スクリプトのコマンドを全部実行する。 というわけで、対象である1行内では、置換成功フラグは、一度立ったら、意識的に下ろしてやらなければ、立ったままになります。具体的には、 s/aa/bb/ s/cc/dd/ が100行も並んでいるところでテストコマンド(t)を使うなら(僕です)、必ず、テストされるべき置換コマンドの前でダミーを入れ、一回フラグを意識的にクリアしてやらなければいけない、ということ。 しつこいけど繰り返すと、対象の1行内では、置換を何度実行しても、成功しようがしまいが、一度立ったフラグはクリアされないのです。 いや、勉強になりました。 危ないところでした。本当にmasaさんに、多謝です。
[4294 ]
Re^4: ちょっとだけ、sed testコマンドについて
文太
2013/02/26(Tue) 11:54
[
4293 ]へのコメント
masaさん(しつこくごめんなさい) sed242というのは、logos版ですね。 serowさんの拡張版ですね。何かが便利になっていた記憶はあります。>dir c:\bin\*SED*.* |grep "17" |to 1992/06/17 11:00 25,108 LSED.EXE 実行速度の違いは、LXとかモバなどなら、大きいでしょうね。XPでも、32ビット版は遅いです。 もっとも、1秒と2秒の差みたいなものですが。スクリプトが長大になると1つの置換ファイルでは収まらず、分割してバッチにするしかありません。そうなると、もう速度差は気にならなくなります。それより、分割を少なくするため、なるべく長いスクリプトを読める32ビット版に頼ることになりますね、僕の場合。 以下、これでも一部です。 2013/02/21 11:30 5,665 OKA.SED 2013/02/18 12:38 3,403 TOTAL1.SED 2013/02/18 13:30 3,436 TOTAL2.SED 2013/02/26 10:23 1,069 TOTAL3.SED tDAMMYをさっき入れました。 2013/02/03 16:30 176 TOTAL9.SED
[4295 ]
DOS基本セット(sed)
文太
2013/02/26(Tue) 12:09
[
4294 ]へのコメント
(しつけぇ〜) そういえば、昔のMS-DOSには、sedがついていた気がした。 XPにはなかった。Dos6.2Vにもなかった。
> そういえば、昔のMS-DOSには、sedがついていた気がした。 私の記憶が確かなら、日本語版のMS-DOSでsedが付属していたものはありません。 だから、ASCIIのTOOLSなんかがよく売れていたわけで。
[4297 ]
Re^2: DOS基本セット(sed)
文太
2013/02/26(Tue) 15:34
[
4296 ]へのコメント
としきさん、こんにちは、お久しぶりです(注)>ジャンプ>私の記憶が確かなら、日本語版のMS-DOSでsedが付属していたものはありません。 >だから、ASCIIのTOOLSなんかがよく売れていたわけで。 なんですかね。だとすると、masaさん、開発者セットをお持ちなんじゃありません? ということは、以下、自粛。mapsym, mapsym, mapsym. 呪文。 :ラベル 「お久しぶり」は、一昨日ぐらいに2年前の震災前ぐらいの過去ログを読んでしまったからなのです。無線ラン騒ぎ。いやあ、あの頃は、本当にお世話になりました。お仕事の合間、合間に、よく教えてもらってるなぁ、と、うるうるしてたところだったのです。 ランをもう一回やろうかと少し思ってはいるのですが、過去ログを読んで−−よくあることなのだけど−−、昔の俺は頭がよかったなぁ、みたいな感じになってしまいました。 11a/b/g/nの違いは、朧気にわかるようになったみたいだけど……。 450Mbpsなんてのが、頭上を飛び交ってるのに……。 有線がいちばんだよ、ボソボソ……。 まてよ、うちの光って、100Mbpsがマックスでなかったっけ? あのルータの横のハブは100マックスだよなぁ……。 具体的な計画はないので、とくに質問もないのですが、過去のことでお礼を申し上げたくて。どうも、どうもでした。ほんとに。m(__)m 今日、届いた本は、『Cによるメモリ管理技法』(別冊インターフェイス)。何を企んでいるんだ? >文太 本を買うのが好きなだけでーす、良い子でーす。
[4298 ]
logos版の拡張
文太
2013/02/26(Tue) 16:37
[
4297 ]へのコメント
何となく作ったメモです(masaさん宛てではありません)。
serow版からの拡張で、元々のsedには、たぶん大半ないもの。
元々のsedというのは、業界標準のGNUのもの、という意味。
#nの採用(スクリプト冒頭 = -n)
s/LHS/RHS/で\t(タブ)を通す
serow logos GNU3.02+1.08 GNU 4.0.7
address OK OK NG OK
LHS OK OK NG OK
RHS NG OK NG OK
-g:s コマンドの置換位置指定がないとき g フラグを付加したものとみなす★
-A:w コマンドにおいて出力ファイルが既に存在するときは後ろに追加する
-O:w コマンドにおいて出力ファイルが既に存在するときは上書きする
-a:次の引数を出力ファイルと解釈する
既にそのファイルが存在するときは後ろに追加する
-o:次の引数を出力ファイルと解釈する
既にそのファイルが存在するときは上書きする
-i:次の引数を入力データファイル名のリストがはいったファイル名と解釈する★
★が面白いし、僕にとって使い手がありそう。
[4302 ]
面白い個数目指定(sed)
文太
2013/02/26(Tue) 22:28
[
4298 ]へのコメント
どばっと書いてしまって、すいません。スルーしてください。 いえ、何かが折れてしまってます……。>-g:s コマンドの置換位置指定がないとき g フラグを付加したものとみなす★ これ、面白いですね。s/RE/replacement/g の最後のgフラグをいちいち付けなくていいよ、ということ。 実は、これより面白いのは、s/RE/replacement/3 みたいに、行内で3つ目にヒットしたのだけ置換せよ、というフラグです。確かに滅多に使わないけど、僕はこれまで5回くらい使ったことがある。awkのフィールド指定もうまくいかないし、みたいな場合でした、たぶん。PCが吐き出す出力には、確かに、「この3つ目のこれだけ置換したいんだ」と言いたいときがありますよね。Vzマクロでも、ちょっと相当めんどいでしょう。確認置換なんてやってられっか、というときがある。 矩形ブロック内の置換みたいな感じ、くすり >めざらさん(気持ちよーく分かりますよ) そうそう、このフラグ、serow版にはなくて、logos版にあるんです。これが僕にとっての、logos版の長所だったんだ。GNUものには、当然あるでしょう。
[4314 ]
Re^3: DOS基本セット(sed)
masa
2013/03/01(Fri) 23:16
[
4297 ]へのコメント
ちょっとよそ見をしていて、久しぶりに来たらツリーが長くなっていて、迷子になりかけてます(笑)。> >だから、ASCIIのTOOLSなんかがよく売れていたわけで。 > > なんですかね。だとすると、masaさん、開発者セットをお持 私もASCIIのTOOLS 基本セット32の中のものを、色々使った記憶があります。本件も、頭の中から蒸発しかけています。ブログ記事や、当時のノートを出して思い出しています。書いておくのは、後からみると貴重ですね。
[4317 ]
Re^4: DOS基本セット(sed)
文太
2013/03/02(Sat) 02:08
[
4314 ]へのコメント
万が一、その「MS-DOS基本セット」のsedというのの正体が何だか分かりましたら、後学のため、お教えくださいね。
[4318 ]
Re^5: DOS基本セット(sed)
masa
2013/03/02(Sat) 12:00
[
4317 ]へのコメント
> 万が一、その「MS-DOS基本セット」のsedというのの正体が何だか分かりましたら、後学のため、お教えくださいね。 ASCIIの「MS-DOS software Tools 基本セット32」は、ASCIIの「MS-DOS software Tools 1〜3巻」の中の32本のソフトを収録したものと書いてあります。しかし、収録されたSEDのドキュメントを見ても、どういう系統か、どういう内容かについては記述がなく分かりません。 少なくとも、s/aa/bb/n のn番目のみ置換は使えます。
[4319 ]
Re^6: DOS基本セット(sed)
文太
2013/03/02(Sat) 18:33
[
4318 ]へのコメント
masaさん
(a)DOS基本セット版(と思う)1990/08/13 29KB
>dir sed.exe |to
C:\BIN\ASTOOLS のディレクトリ
1988/05/02 02:56 27,899 SED.EXE
という感じだったので、それとも違う、と思っていたのです。
>ASCIIの「MS-DOS software Tools 基本セット32」は、ASCIIの「MS-DOS software
> Tools 1〜3巻」の中の32本のソフトを収録したものと書いてあります。
なるほど、vol.1-3 の選りすぐりをまとめたセットがあったわけですね。
アスキー内でのsedのヴァージョンが違うわけだ。
>少なくとも、s/aa/bb/n のn番目のみ置換は使えます。
すると、serow版のみ、それができないということですね。なんでわざわざ外した
んだろう? とはいえ、ないものはないので、疑問を抱いても意味はないのですが。
[4320 ]
Re^7: DOS基本セット(sed)
masa
2013/03/02(Sat) 21:13
[
4319 ]へのコメント
> (a)DOS基本セット版(と思う)1990/08/13 29KB あ、私のモジュールの詳細も書けば良かったですね。今みたら SED.EXE 29KB 1990/08/13 3:04 でした。
正体、という言い方がふさわしいかは別にして。 基本セットにあるかはわかりませんが、ASCII ToolsにはWHATコマンドというものがあったはず。 コマンドプロンプトで>what sed.exe とかすると、大昔のバージョン管理システムであるSCCSのIDを表示してくれます。あるいは、STRINGSコマンドで実行ファイル中の可読文字を読めば、著作権情報とかが埋め込まれているのが読めるかもしれません。 #最近作られた、某遠隔操作ソフトでも類似の状況があった模様 ところで、「基本セット32」は「Tools1〜3」から精選した、という話は私も聞いたことがあります。でも、ちょっと書誌情報を調べてみたら Tools 1: ISBN:4871481786 1992年5月発行 基本セット32: ISBN:4756105181 1990年12月発行 基本セット40: ISBN:475610567X 1994年12月発行 だそうで。別物を見ているのかなぁ。
[4322 ]
Re^8: DOS基本セット(sed)
masa
2013/03/02(Sat) 23:28
[
4321 ]へのコメント
> 基本セットにあるかはわかりませんが、ASCII ToolsにはWHATコマンドというものがあったはず。 残念ながら、基本セット32には入っていませんでした。 実行ファイルの中をバイナリーエディターで見たのですが、あまり手がかりになりそうな記述はありませんでした。キャラクタテーブルみたいなところで、それらしく見えたのは 「SED-3.13」という文字くらいでした。 あとは [<file>...]...@( #)main.c.2.66 (A SCII) 4/25/88.d+ このような文字列ですね。 > 基本セット32: > ISBN:4756105181 > 1990年12月発行 手持ちのISBNは上記と一緒です。 1990-07-30 初版 1992-07-30 1版第7刷 ← これを買いました。 中の記述には、確かに MS-DOS Software Tools パッケージ1〜3から選んだものを収録したと書いてあるんですが、、。
[4323 ]
Re^9: DOS基本セット(sed)
文太
2013/03/02(Sat) 23:38
[
4322 ]へのコメント
C:\BIN\ASTOOLS>what sed.exe
sed.exe
# SED - 3.12
main.c 2.66 (ASCII) 4/25/88
compile.c 2.76 (ASCII) 4/25/88
execute.c 3.24 (ASCII) 4/25/88
getput.c 1.25 (ASCII) 4/25/88
cmds.c 1.14 (ASCII) 3/28/88
regcomp.c 2.31 (ASCII) 4/27/88
findpat.c 2.30 (ASCII) 3/24/88
regsub.c 1.80 (ASCII) 3/24/88
advance.c 2.31 (ASCII) 3/27/88
うちのアスキー sed はこんな感じです。version 3.12 ですって。
strings も面白かったけど、ちょっと長すぎるのと、serow 版もやって比較対
照するのが大変すぎみたいだったので、割愛です。
アスキーとアスキーのプログラマは、 いちおう GNU ライセンスを外して商品
をつくらなければならなかったわけで、色々と複雑だったのでしょうね。本家の
sed と互換をもちながら、いちおうスクラッチから書かなくてはいけない、と。
時代的には、アスキーの努力は認められてよいと思います。serow 版と近すぎ
たのかもしれませんが。
でも、sed って、プログラム本体より、「どう使うか、どう使えるのか」の情
報が大事な、ある意味、不思議なツールみたいな気もします。ま、置換だけのツ
ールとしても、十分でしょうね。
Tools 1:
1992年5月発行 --->vol.1: 85年, vol.2: 87年, vol.3: 88年です。
基本セット32:1990年12月発行
基本セット40:1994年12月発行
[4324 ]
まとめ(ASCII, Software-Tools)
文太
2013/03/03(Sun) 12:09
[
4323 ]へのコメント
適当に判断してまとめました。
ASCII, MS-DOS Software-Tools
初版
Tools 1: 1985/12
Tools 2: 1987/03
Tools 3: 1988/06 sed v.3.12 (1988/05/02)
基本セット32: 1990/07 sed v.3.13 (1990/08/13)---92年セット収録
基本セット40: 1994/12
> アスキーとアスキーのプログラマは、 いちおう GNU ライセンスを外して商品 > をつくらなければならなかったわけで、色々と複雑だったのでしょうね。本家の 御意。 ただ、当時、GNU以外のSEDもありましたから、外部仕様の参考にできる資料には事欠かなかったはず。> Tools 1: > 1992年5月発行 --->vol.1: 85年, vol.2: 87年, vol.3: 88年です。 そうですよね。 そうでなければ時系列が狂ってしまいますものね。 ところで、その、80年代に発行されたものにはISBN番号ってついていませんか?
[4326 ]
Re^11: DOS基本セット(sed)
文太
2013/03/03(Sun) 16:03
[
4325 ]へのコメント
としきさん>ところで、その、80年代に発行されたものにはISBN番号ってついていませんか? まとめで勝手に削除してしまって、申し訳ありません。 手元資料では、ISBNがまったく確認できないのです。理由は想像できますが、想像してください。裏表紙がないんですね。
> 想像してください。 筋肉がたくましくない分、妄想がたくましい私にかかれば、全く問題ありません。なるほど、そういうことでしたか。 #おいこら
[4329 ]
Re^11: DOS基本セット(sed)
konno
2013/03/04(Mon) 00:49
[
4325 ]へのコメント
> > アスキーとアスキーのプログラマは、 いちおう GNU ライセンスを外して商品 > > をつくらなければならなかったわけで、色々と複雑だったのでしょうね。本家の う〜ん、当時、85年ごろだとGNUなんて聞いたこともありませんでしたね。 フリーソフトなんてものもあまりなかったような。 なので、私の認識では、UNIXの互換コマンドをDOS用に一から作ったよ。 くらいに思っていました。 ググってみると、GNU は GPL だったんですね。別物かと思ってました。 で、GPLバージョン1は、1989年2月にリリースされたそうなので、 TOOLSシリーズは独自ソースなんだろうと思っています。> > Tools 1: > > 1992年5月発行 --->vol.1: 85年, vol.2: 87年, vol.3: 88年です。 うちもマニュアルが発掘できました。 TOOLS 1 85年12月15日 初版 89年 6月21日 第1版第7刷 TOOLS 2 87年 3月31日 初版 89年 2月11日 第1版第5刷 TOOLS 3 88年 6月11日 初版 89年 5月 1日 第1版第3刷 ということで、89年以降に購入したようです。当時1冊9800\は高かった。 sedが載っているのはTOOLS3なので、まとめて買ったのだったかな。> ところで、その、80年代に発行されたものにはISBN番号ってついていませんか? マニュアル本にはそのような番号は見当たりませんね。
[4328 ]
Re^4: DOS基本セット(sed)
konno
2013/03/03(Sun) 23:40
[
4314 ]へのコメント
> ちょっとよそ見をしていて、久しぶりに来たらツリーが長くなっていて、迷子になりかけてます(笑)。 masaさん、文太さん、sedコマンドの使い方やまとめ、ありがたいです。
私も遅れてきたら、ツリーが長くなってて、どこにコメントしていいやら。(^^;
こういう有用な情報は必要な時にすぐに参照したいですよね。
ということで、うちのVzWikiのサイドバーに野ざらし言のお宝リンク集を
作り、sedの項目でリンクさせてもらいました。m(__)m
http://hpcgi3.nifty.com/tamaneko/Wifky/wifky.pl > > >だから、ASCIIのTOOLSなんかがよく売れていたわけで。 懐かしいですね、私もお世話になってました。
あまり使いこなせてはいなかったですが。(^^;
[4301 ]
修正2点
文太
2013/02/26(Tue) 22:11
[
4291 ]へのコメント
(1)masaさん
ブログのほう、ちゃんと読み切れていませんで失礼しました。
フラグリセットのタイミング、ちゃんと書かれておられましたね。m(__)m
>対策としては、下記のように、間にリセット用のtコマンドを挟むか、
>tではなく「/アドレス/コマンド」のフォーマットを使用します。
ですが、この後半はどうなのでしょう? 僕には意図が読めませんでした。
/address1/d
/address2/d
/address3/d
が100行書かれていても、その100行を検査しているうちは、対象ファイル
の次行は読み込まれないと思います。
たぶん、何か違う話ですよね?
s/000/111/ (1)
/address1/d
/address2/d
s/aaa/bbb/ (2)
tx
s/ccc/ddd/ (3)
:x
/address99/d
/address100/d
(1)で置換成功フラグが立ったら、もう(2)の結果はどうあれ、(3)が飛ば
されることはないと思います(serow, logos版, 基本セット版以外は=すいません、
これらが普通でない振る舞いをしています。それが好きだ、というのは別の話と
して)。
アドレッシングで飛ばす(ある置換を避ける)方法としては、以下を僕はよく
使います。
/address1/b tobashi
s/address2/replacement/
:tobashi
s/LHS/RHS/のLHS(Left Hand String=左側文字列)って、アドレッシング
と同じですからね。
--- おまけ ---
>c:\bin\astools\sed -f c:\t2.sed c:\t1.txt ;ascii tools
sed: command garbled: tx ;スペースを入れろかよぉ
;これはありえん
>c:\bin\astools\sed -f c:\t2.sed c:\t1.txt
か い く ;asciiよ、お前もか
>dir c:\bin\astools\sed.exe |to
1988/05/02 02:56 27,899 SED.EXE
--------------
(2)自分の修正
DAMMYとか恥ずかしげもなく書いていますが、いわゆるダミーのスペリングは、
DUMMYです。恥を知れ >文太
[4303 ]
分岐コマンド後ろのスペース
文太
2013/02/27(Wed) 11:39
[
4301 ]へのコメント
確たる証拠はありませんし、 下のアスキーの sed の振る舞いが正統的だと信
じているわけでもないのですが、かなり信用しているオライリーの本が、どうや
ら一貫してそのような表記を使っているので、そちらを暫定的に信用することに
しました。
前置き(言い訳)が長い!
「分岐ラベルの後ろでは、スペースを置く」。これを正しい書法と信じること
にしました。
つまり、 b tobashi とか、t begin とか、t end あるいは t x みたいなので
いこう、ということ。
因みに、ラベル名は、8文字以内のこと。
ええ、sed では、このようなつまらないことで躓くことが、けっこうあるので
す。
Onigsed ぐらい(正体は、GNU sed 4)新しいものになると、それなりに細か
いエラーメッセージを出してくれるのですが、古いのはスクリプトの何がいけな
いのか、なかなか教えてくれません。下のだって「スペースが問題を起こすこと
がある」というのが頭になかったら、「何を文句いってやがる」となりますね。
スペースの扱いには、色々あります。
-----
>c:\bin\astools\sed -f c:\t2.sed c:\t1.txt ;ascii tools
sed: command garbled: tx ;スペースを入れろかよぉ
;これはありえん
[4304 ]
大昔もあった
文太
2013/02/27(Wed) 21:54
[
4303 ]へのコメント
FGALDC 14階 9年前くらい?
ほとんど怨念になってるみたいだ……。
>08316/08316 ZXH10116 文太 RE:sed.shdの叩き台を19階に
>(14) 04/11/05 00:16
SPICAさ〜ん、(以下は、serow版sedに添付のsed.doc)
t <label> 直前に入力された文字列に対して置換が実行された場合,
または't'や'T'コマンドが実行された後であれば,
:<label>で示した位置にジャンプする。
http://www.opengroup.org/onlinepubs/007908799/xcu/sed.html
[2addr]t [label]
Test. Branch to the : command bearing the label if any substitutions have
been made since the most recent reading of an input line or execution
of a t.
これは誤訳だ。どうして、こんな誤訳になるのかは分からないけれど。"since"
は、「以来」です。だから、強引に直訳だけすれば、「もっとも現在に近いとこ
ろで入力が読み込まれたか、t コマンドが実行されたかの時点から(=以来)、
現在までの間に置換が成功していれば、: コマンドが持っているラベルに分岐す
る」(変な日本語、でももっと変な英語です。SPICAさんのせいでなく、元のdoc
を書いた奴も悪い。"poorly documented"って、こういう意味もあるんだ!)
t label
If a s/// has done a successful substitution since
the last input line was read and since the last t
command, then branch to label; if label is omitted,
branch to end of script.
(sed32.man)
うーん、こっちのほうが、ずっとちゃんとした英語だ。
個人的に、以下に差し替えました。
置換に成功したかどうかをテストし、置換されていれば、: ラベルでマークさ
れた行に分岐する。
----- アーティクルお終い -----
Test. Branch to the : command bearing the label if any substitutions have
been made since the most recent reading of an input line or execution
of a t.
訳してみますね。
【テスト・コマンド t 】
パターンスペースに現在ある行が入力された時点から、あるいは同じ入力行で
テスト・コマンドが最後に実行された時点から、一度でも置換が成功していた
場合に、:ラベルの位置に分岐する。
[4305 ]
sed t コマンド(まとめ)
文太
2013/02/28(Thu) 00:41
[
4304 ]へのコメント
>sed -f t.sed t.txt
--- input = t.txt ---
111 222 333 444 555
--- result ---
●●● 222 333 444 ●●● sed谷本 (GNU 1.18 multibyte 1.03)
●●● 222 333 444 ●●● onigsed (GNU 4.1.5 Oniguruma v. 2.5.0)
●●● 222 333 444 ●●● sed32 (GNU 3.0.2 multibyte 1.07)
●●● 222 333 444 ●●● mbsed (GNU 4.1.4 multibyte)
●●● 222 333 444 ●●● ssed (super sed, based on GNU 4.1)
--- --- --- --- 上は全てGNU系。下は古めの日本語MS-DOS移植版
●●● ○○○ ○○○ ○○○ ●●● oldsed by serow(1988/03/02)
●●● ○○○ ○○○ ○○○ ●●● lsed by logos(1992/06/17)
●●● ○○○ ○○○ ○○○ ●●● ascii sed(1988/05/02)
--- t.sed ---
s/111/●●●/ success = flag ON
/あああ/d dummy
/いいい/d dummy
/ううう/d dummy
s/えええ/★★★/ no match, but flag no change, so still ON
t tobe flag is ON, so jump even though the test failed
s/222/○○○/ skip (supposedly)
s/333/○○○/ skip (supposedly)
s/444/○○○/ skip (supposedly)
:tobe landing
s/555/●●●/ success
logos さんは、「serow さんの拡張版をつくった」と言っているので、その部
分のコードはそのままなのでしょう。
serow さんが、オリジナルの仕様をどこまで読み切り、それを(おそらく)バ
グと認定して改訂を行なったのかは分かりません。アスキー・ツールズは、それ
をバグと認定しているようですが。
もっとも、 フラグをどのタイミングで OFF にするのか、serow 版にせよアス
キー版にせよ、きちんとドキュメントしてるようでもないので、またしても罠に
はまらないように、僕は、いつも masa さんのダミー予防薬を飲んでもらってか
ら、t コマンドさんに仕事をしてもらおうと思います。
僕は、t コマンドのこの振る舞いを「仕様」と考えていますが。
[4306 ]
追記
文太
2013/02/28(Thu) 00:48
[
4304 ]へのコメント
深追いするつもりはないのですが。 "the most recent reading of an input line"とか"the last input line was read"という表現に、一つ盲点があるらしい。nコマンドです。nコマンドはスクリプト実行中にノーマルなsedの入出力から逸脱して、新しい行を読み込みます。 使ったことがないし、使う予定もないので、パスです。 この場合の振る舞いを指して、アスキーは「バグ」と言ってる模様でした。
> Test. Branch to the : command bearing the label if any substitutions have > been made since the most recent reading of an input line or execution > of a t. > > 訳してみますね。 ふむ、英語がわかる人が訳すと、わかりやすい(ないしは、わかった気になる)日本語が出力されてきますね。 私が訳すと、以下のような感じ。 テストコマンド 直近の入力行が読み込まれた後、またはテストコマンドが実行された後に置換が成功していたら、:で示されたラベルに分岐する。> これは誤訳だ。どうして、こんな誤訳になるのかは分からないけれど。 私は当初、これに近い訳文になっていました。 なぜかというと、 Branch to the : command bearing the label if execution of a t or if any substitutions have been made since the most recent reading of an input line. テストコマンド実行後、または直近の入力行で置換が成功していたら、ラベルに分岐する。 というように構文解析してしまったのですね。 なので、私には、そのように訳したくなる気持ちはなんとなくわかりそうです。
[4308 ]
Re^2: 大昔もあった
文太
2013/02/28(Thu) 01:30
[
4307 ]へのコメント
Branch to the : command bearing the label
if execution of a t このひっくり返しが混乱の元。
そして、if のあとには、主語S+動詞Vがくるので、if t command is executed
という形にしかなれません。「もしtが実行されていたら」を「もしt実行」と
表現したようなもの。
or
if any substitutions have been made since the most recent reading of an input line.
---
英語は前から読みましょう。僕は、最初、前から訳したものをつくっていて、
最後に、えい、こっちのほうが日本語らしいのだろう、と「ラベルに分岐せよ」
を最後に後ろに持っていきました。
Test.
Branch to the : command bearing the label
if any substitutions have been made
since the most recent reading of an input line
or
execution of a t.
ネストは、ふつう、ただ下がっていきます。
>英語がわかる人が訳すと
・文脈がだいたい分かれば単語の意味は推測できるよ
・単語が分からないと文脈がそもそも分からないと思うのですが
みたいなものですが、意味がわかると訳せます。英語が分かっても意味が分か
らないと訳せません。というか、意味が分からないときには、英語も分かってま
せん。分離不可です。たぶん、日本語でも同じです。何度も同じ会話をしてます
ね。
anyを「一度でも」とおいたところに注目してほしかった。
[4309 ]
本当に最後のまとめ
文太
2013/02/28(Thu) 12:16
[
4308 ]へのコメント
しつこいねぇ。
【テスト・コマンド t】
置換が成功したらラベル位置にジャンプする。しかし、その「置換成功」
にはややこしい条件がある。フラグをオンにする置換成功が、テスト・コマ
ンドの直前である必要はまったくないからだ。行入力のサイクルに入って1
度でも置換が成功すればフラグが立ち、たとえ直前の置換に失敗していても、
ジャンプしてしまう。また、テストコマンドが指示されれば、フラグは強制
的に下ろされる。
置換コマンドがフラグ下ろしに関与しない以上、使用には注意が必要だ。
複数の置換コマンドが使われるスクリプトにおいては、具体的に、テストコ
マンドを使う直前の箇所で、以下のような意識的なフラグ管理をするしかな
い。
t DMY ;フラグ管理=フラグを下ろす
:DMY
s/aaa/bbb/ ;テストしたい置換(置換成功でフラグが立つ)
t tobashi ;テストコマンドによる分岐判定
other commands
:tobashi ;分岐先
さらに、 nコマンドのように、スクリプトの途中、つまり通常の行入力
サイクルの途中で、次の入力行を読む込む場合は、もっとややこしい。
因みに、テストコマンド(t)、単純な分岐コマンド(b, branch)の
ジャンプ先は、スクリプトの前方である必要はなく、以下のように、
:LOOP
t DMY
:DMY
s/aaa/bbb/
t LOOP
other commands
スクリプトの上方、つまり時間的に前にもどることができる。これにより、
ループを構成することも可能である。が、このようなプログラムの書き方は、
「信者のためのsedスクリプト」と揶揄されることになるようだ。
さらに付言すれば、 MS-DOS時代にUNIXから移植された日本語版のsedには、
この面倒な仕様を改善した版のsedがある。serow, logos, ascii版など。
しかし、sedはsedで頑なであり(頑固でないsedはsedでないらしい)、本家に、
上に記した仕様を変える気はない。
さらに、「改善日本語」版も、フラグ管理の改善仕様に関して、明確に
ドキュメントしているわけでもない。
ややこしい仕様を理解して、 フラグの自前管理をすれば、どのsedでも間違い
なく使えるはずだ。
tが「置換に成功したらジャンプ」だとしたら、Tは「置換に失敗したら
ジャンプ」というコマンドである。 これはGNUの拡張らしいので、実装されて
いないsedもあるのだろう。
実装されていない場合には、
t seikou
b shippai
と強制ジャンプを入れればよい。
もちろん、Tを使えば、
T shippai
と1行で書けるということだ。
[4311 ]
Re: 本当に最後のまとめ
文太
2013/02/28(Thu) 19:00
[
4309 ]へのコメント
最後の追記(nコマンドなど)
nコマンドとtコマンドについては、はぐらかしましたが、大丈夫、
置換成功フラグを自前管理すれば、問題は起こらない。
使ったことがないけど、nの使用例として、以下が参考になるのかも。
Sed "n;n;n;n;G;" 5行ごとに空行挿入
Sed -n "/RE/{n;p;}" パターンの次行をプリント
パターン、条件を決めておいて、でも何かをしたいのは、じつは「次の行」
あるいは「次の次の行」みたいなとき、使えるのかな。
-----
アスキー『MS-DOS を 256 倍使うための本 vol.3』pp.82-83, p.218 によると、
ある種のsed は、nコマンドに限らず、新たな行入力があったときにさえ、置換
成功フラグをクリアしないされないとされている。 どの sed の話だか、本当な
のだか分からない(ちょっと気に障る書き方だ)。
とはいえ、nにしろ、新たな行入力にせよ、置換成功フラグを自前管理さえす
れば、tコマンドは安心して使えます。
因みに、この『256倍』sed部を執筆しているのは、福崎俊博さんで(たぶん)、
福崎さんは、僕がかなり信用している、オライリーのDale Doughertyの『sed & awk』
の訳者さんでもあり(翻訳はアスキー出版局刊)、間違ったことを書いているとは
思えないのだけど、ちょっと変だと思う。
このtコマンドへの記述やascii版での改造がなされていたとき、serowさんの版
がすでにあったわけだし、serowさんも
Written for the GNU operating system by Eric S. Raymond
というSEDの日本語MS-DOS移植をしたので、何にいちゃもんをつけてるのか分かり
ません。
ですので、ある時期の日本でなされたtコマンドの「改善」は、ちょっと
ガラパゴス化的だったのじゃないか、というのが僕の結論です。
もっとも、回避策が、どのsed関連ドキュメントにも載っていない、というのは、
何だかもっと変だな、とも思っています。
いずれにせよ、どう転んでも間違いのない回避策の発案者は、masaさんです。
あれが全くの正解。だと信じる。
> 英語は前から読みましょう。 これよ、これ。 高校ぐらいから言われ続けているのですが、全くものにならなくて。> anyを「一度でも」とおいたところに注目してほしかった。 やっぱり、目の付け所、というのが私に欠けているところなのかなぁ。
[4313 ]
Re^4: 大昔もあった
文太
2013/03/01(Fri) 01:41
[
4312 ]へのコメント
>> 英語は前から読みましょう。 >これよ、これ。 >高校ぐらいから言われ続けているのですが、全くものにならなくて。 ある程度、量を読むしかないと思う。「日本語で理解している」のと「英語で理解している」の違いは、その辺だろうと思います。 僕は、脳の使い方が違うんだろうな、と思っています。英語的な回路(シナプスの連係?)をつくるしかないんでしょう。 でも、これは英語が分かるようになるという目標での話です。抽象的で高度な思考では、おかしな翻訳をとおしてでも、ちゃんと理解してる場合もあるみたいだからです。 「量を読む」というのは「量を聞く」でも同じだと思います。ふつう、「読む」ほうが日本人には楽だと思うけど。
[4310 ]
氷解!
文太
2013/02/28(Thu) 18:34
[
4301 ]へのコメント
masaさん
爆走に「お疲れさま」って感じでしょうか。でも、分かりましたよ!
tコマンドの困った仕様を/アドレッシング/で回避する方法。
tコマンドというのはsコマンドでの置換が成功したかどうかで分岐
させる機能です。
でも、sコマンドには、ほとんどアドレッシングと同じ内容が含まれている。
じゃ、sコマンドの結果を使わずに、アドレッシングだけで先に分岐させておけば
いいじゃないか。こういうことですね。
具体的に言い直すと、
s/aaa/bbb/
の結果で分岐するとは、/aaa/がヒットしたかしないかで分岐させるということ。
なら
/aaa/b atari
commands1 ;/aaa/!{ ... } (1)
b motoni
:atari
commands2 ;/aaa/{ ... } (2)
:motoni ;(1)と(2)がここで合流
コメントの左側はアセンブラ的なラベルジャンプ多用型。
右側は少しC的にif-else型。
なんか、頭が違う方向へ爆走していたようです。おしまい!
ほんとに、非対話型ストリーム・エディタ SED のようになった。
[4315 ]
Re: 氷解!
masa
2013/03/01(Fri) 23:50
[
4310 ]へのコメント
> 爆走に「お疲れさま」って感じでしょうか。でも、分かりましたよ! いや、本当にご苦労さまでした。ちょっとよそ見をしていた間に、まとめまできてしまいましたね。> tコマンドの困った仕様を/アドレッシング/で回避する方法。 tが困るなら、tを使わなければよい、、という発想だけです。tはsと組んで、処理と判定を兼ねてますが、判定分岐だけの方が分かりやすいなと思った次第です。 スタートのVZマクロの話から、凄い方向へ来ましたね。お疲れ様でした。
[4316 ]
Re^2: 氷解!
文太
2013/03/02(Sat) 02:06
[
4315 ]へのコメント
masaさん>スタートのVZマクロの話から、凄い方向へ来ましたね。お疲れ様でした。 いえいえ、ほんとに、こんなことになるとは思ってもいませんでした。 個人的には、9年ぶりの問題にかたをつけたわけで、嬉しく思っています。 正規表現や sed の仕様については、それぞれの考え方があると思います。 目の前にあるこの sed の使い方を知りたいんだ、から、sed って普通こういうもんでしょ、まで。 正規表現にいたっては、Vz的には、VWX の正規表現を正確に知りたいだけなんだ、から、今の perl ではどうなってるまで。 いずれにせよ、僕個人としては、同じような問題意識をもった人に出会え、解法まで教えてもらえて、また泥沼に入れていただいて脱出できたのですから、収穫です。 ありがとうございます。テキスト処理もVzも、完全にすたれた時代にあって、ちょっと久しぶりに燃えてしまいました。楽しい経験・時間でした。ありがとうございます。 また、何かが重なると楽しいですね。宜しくお願いいたします。
↑ このページの先頭